2013-02-26 66 views
0

我有加盟商的租金设备 我的客户是租掉加盟 两个加盟商和顾客是用户正确的模型关系,对cakephp2主键和外键查询

我有一个用户表,加盟商表,客户表和预订表。

的表是这样的:

CREATE TABLE IF NOT EXISTS `franchisees` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) DEFAULT NULL, 
    `group_id` int(11) DEFAULT NULL, 
    `firstname` varchar(20) DEFAULT NULL, 
    `lastname` varchar(20) DEFAULT NULL, 
    `address1` varchar(150) DEFAULT NULL, 
    `address2` varchar(150) DEFAULT NULL, 
    `city` varchar(20) DEFAULT NULL, 
    `postcode` varchar(10) DEFAULT NULL, 
    `phone` varchar(15) DEFAULT NULL, 
    `alt_phone` varchar(15) DEFAULT NULL, 
    `lat` float DEFAULT NULL, 
    `lng` float DEFAULT NULL, 
    `created` timestamp NULL DEFAULT NULL, 
    `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

CREATE TABLE IF NOT EXISTS `customers` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) DEFAULT NULL, 
    `group_id` int(11) DEFAULT NULL, 
    `firstname` varchar(20) DEFAULT NULL, 
    `lastname` varchar(20) DEFAULT NULL, 
    `address1` varchar(150) DEFAULT NULL, 
    `address2` varchar(150) DEFAULT NULL, 
    `city` varchar(20) DEFAULT NULL, 
    `postcode` varchar(10) DEFAULT NULL, 
    `phone` varchar(15) DEFAULT NULL, 
    `alt_phone` varchar(15) DEFAULT NULL, 
    `lat` float DEFAULT NULL, 
    `lng` float DEFAULT NULL, 
    `created` timestamp NULL DEFAULT NULL, 
    `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

CREATE TABLE IF NOT EXISTS `bookings` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `customer_id` int(11) DEFAULT NULL, 
    `franchisee_id` int(11) DEFAULT NULL, 
    `booking_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP, 
    `start_date` datetime DEFAULT NULL, 
    `end_date` datetime NOT NULL, 
    `event_location` text, 
    `price` float DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

我的模型关系的定义是这样的:

加盟商

public $name = 'Franchisee'; 
public $hasMany = array(
    'FranchiseeBooking' => array(
     'className' => 'Booking', 
     'foreignKey' => 'franchisee_id' 
    ) 
); 

客户

public $name = 'Customer'; 
public $hasMany = array(
    'CustomerBooking' => array(
     'className' => 'Booking', 
     'foreignKey' => 'customer_id' 
    ) 
); 

预订

public $name = 'Booking'; 
public $belongsTo = array(
    'Customers' => array(
     'className' => 'Customer', 
     'foreignKey' => 'customer_id' 
    ), 
    'Franchisees' => array(
     'className' => 'Franchisee', 
     'foreignKey' => 'franchisee_id' 
    ) 
); 

所以,我想查询预订表(其中franchisee_id被登录的用户),并得到了加盟商的预订,酒店以及相关的客户数据。

$options = array('conditions' => array('Booking.franchisee_id' => $this->_authUser)); 
$bookings = $this->Booking->find('all'); 

结果在下面的查询:

SELECT `Booking`.`id`, `Booking`.`customer_id`, `Booking`.`franchisee_id`, `Booking`.`booking_date`, `Booking`.`start_date`, `Booking`.`end_date`, `Booking`.`event_location`, `Booking`.`price`, `BookingCustomers`.`id`, `BookingCustomers`.`user_id`, `BookingCustomers`.`group_id`, `BookingCustomers`.`firstname`, `BookingCustomers`.`lastname`, `BookingCustomers`.`address1`, `BookingCustomers`.`address2`, `BookingCustomers`.`city`, `BookingCustomers`.`postcode`, `BookingCustomers`.`phone`, `BookingCustomers`.`alt_phone`, `BookingCustomers`.`lat`, `BookingCustomers`.`lng`, `BookingCustomers`.`created`, `BookingCustomers`.`modified`, `BookingFranchisees`.`id`, `BookingFranchisees`.`user_id`, `BookingFranchisees`.`group_id`, `BookingFranchisees`.`firstname`, `BookingFranchisees`.`lastname`, `BookingFranchisees`.`address1`, `BookingFranchisees`.`address2`, `BookingFranchisees`.`city`, `BookingFranchisees`.`postcode`, `BookingFranchisees`.`phone`, `BookingFranchisees`.`alt_phone`, `BookingFranchisees`.`lat`, `BookingFranchisees`.`lng`, `BookingFranchisees`.`created`, `BookingFranchisees`.`modified` FROM `trailblazer`.`bookings` AS `Booking` LEFT JOIN `trailblazer`.`customers` AS `BookingCustomers` ON (`Booking`.`customer_id` = `BookingCustomers`.`id`) LEFT JOIN `trailblazer`.`franchisees` AS `BookingFranchisees` ON (`Booking`.`franchisee_id` = `BookingFranchisees`.`id`) WHERE 1 = 1 

看起来像这样当阵列打印出来:

Array 
(
    [0] => Array 
     (
      [Booking] => Array 
       (
        [id] => 1 
        [customer_id] => 8 
        [franchisee_id] => 7 
        [booking_date] => 2013-02-25 11:44:29 
        [start_date] => 2013-03-06 11:45:00 
        [end_date] => 2013-03-08 11:45:00 
        [event_location] => Belfast 
        [price] => 900 
       ) 

      [BookingCustomers] => Array 
       (
        [id] => 
        [user_id] => 
        [group_id] => 
        [firstname] => 
        [lastname] => 
        [address1] => 
        [address2] => 
        [city] => 
        [postcode] => 
        [phone] => 
        [alt_phone] => 
        [lat] => 
        [lng] => 
        [created] => 
        [modified] => 
       ) 

      [BookingFranchisees] => Array 
       (
        [id] => 
        [user_id] => 
        [group_id] => 
        [firstname] => 
        [lastname] => 
        [address1] => 
        [address2] => 
        [city] => 
        [postcode] => 
        [phone] => 
        [alt_phone] => 
        [lat] => 
        [lng] => 
        [created] => 
        [modified] => 
       ) 

     ) 

    [1] => Array 
     (
      [Booking] => Array 
       (
        [id] => 2 
        [customer_id] => 14 
        [franchisee_id] => 7 
        [booking_date] => 2013-02-25 16:18:44 
        [start_date] => 2013-02-08 16:15:00 
        [end_date] => 2013-02-23 16:15:00 
        [event_location] => 
        [price] => 6750 
       ) 

      [BookingCustomers] => Array 
       (
        [id] => 
        [user_id] => 
        [group_id] => 
        [firstname] => 
        [lastname] => 
        [address1] => 
        [address2] => 
        [city] => 
        [postcode] => 
        [phone] => 
        [alt_phone] => 
        [lat] => 
        [lng] => 
        [created] => 
        [modified] => 
       ) 

      [BookingFranchisees] => Array 
       (
        [id] => 
        [user_id] => 
        [group_id] => 
        [firstname] => 
        [lastname] => 
        [address1] => 
        [address2] => 
        [city] => 
        [postcode] => 
        [phone] => 
        [alt_phone] => 
        [lat] => 
        [lng] => 
        [created] => 
        [modified] => 
       ) 

     ) 

) 

正如你所看到的,我没有得到相关数据。我有一种感觉,这个问题与主键和外键有关,但我不知道我错在哪里。任何人都可以解释这一点? (我使用cakephp 2.3)

+0

确保设置了'$ recursive = -1;',然后发布它生成的新查询。此外,为什么你使用别名而不是“预订”你的hasMany关联? – Dave 2013-02-26 16:01:44

+0

是否有任何数据插入到相应的表中?在我看来,你的关系是好的,因为你的find()方法获取所需的所有数据。问题是你的表可能没有任何数据。 – 2013-02-26 17:15:14

回答

0

我相信你的用户ID没有被正确调用。尝试:

$options = array('conditions' => array('Booking.franchisee_id' => $this->Auth->user('id')));