2015-09-20 90 views
3

我有三個表: 店 deliverable_sets 城市如何加入CakePHP的三個表,其中一人是HABTM表

有如下關係:

//Store 
    public $hasMany = array(
     'DeliverableSet' => array(
      'className' => 'DeliverableSet', 
      'foreignKey' => 'store_id', 
      'dependent' => false, 
      'conditions' => '', 
      'fields' => '', 
      'order' => '', 
      'limit' => '', 
      'offset' => '', 
      'exclusive' => '', 
      'finderQuery' => '', 
      'counterQuery' => '' 
     ) 
    ); 

    //DeliverableSet 
    public $belongsTo = array(
      'Store' => array(
       'className' => 'Store', 
       'foreignKey' => 'store_id', 
       'conditions' => '', 
       'fields' => '', 
       'order' => '' 
      ) 
     ); 
//DeliverableSet 
    public $hasAndBelongsToMany = array(
      'City' => array(
       'className' => 'City', 
       'joinTable' => 'cities_deliverable_sets', 
       'foreignKey' => 'deliverable_set_id', 
       'associationForeignKey' => 'city_id', 
       'unique' => 'keepExisting', 
       'conditions' => '', 
       'fields' => '', 
       'order' => '', 
       'limit' => '', 
       'offset' => '', 
       'finderQuery' => '', 
      ) 
     ); 

現在,我希望獲取列表通過deliverradble_set分配到商店的所有城市。

我試過這段代碼,但它不起作用。

$data = $this->DeliverableSet->Store->find('all', array(
    'joins' => array(
     array(
      'table' => 'deliverable_sets', 
      'alias' => 'DeliverableSetJoin', 
      'type' => 'INNER', 
      'conditions' => array(
       'DeliverableSetJoin.store_id = Store.id' 
      ) 
     ), 

     array(
      'table' => 'cities_deliverable_sets', 
      'alias' => 'CityDeliverableSetJoin', 
      'type' => 'INNER', 
      'conditions' => array(
       'CityDeliverableSetJoin.deliverable_set_id = DeliverableSetJoin.id' 
      ), 
      array(
      'table' => 'cities', 
      'alias' => 'CityJoin', 
      'type' => 'INNER', 
      'conditions' => array(
       'CityDeliverableSetJoin.city_id = CityJoin.id' 
      ) 
     ) 
    ), 
    'conditions' => array(
     'Store.id' => 11 
    ), 
    'fields' => array('DeliverableSetJoin.id', 'Store.id','CityJoin.id'), 
    'order' => 'Store.created DESC' 
))); 
debug($data);exit; 

基本上我要運行該SQL在CakePHP的find方法:它的工作原理

$set = $this->DeliverableSet->query('select cities_deliverable_sets.city_id from stores 
inner join deliverable_sets on deliverable_sets.store_id = stores.id 
inner join cities_deliverable_sets on cities_deliverable_sets.deliverable_set_id = deliverable_sets.id 
WHERE stores.id = 11 
order by stores.id asc'); 
+0

是什麼異常被拋出?特別是什麼是異常狀態的SQL語句?同時說明確切的CakePHP版本。 – DIDoS

+0

@ele。感謝您的答覆。經過一番研發,我找到了解決方案。 –

回答

1

現在:在下面的SQL

$this->DeliverableSet->Store = -1; 
      $data = $this->DeliverableSet->Store->find('all', array(
    'joins' => array(
     array(
      'table' => 'deliverable_sets', 
      'alias' => 'DeliverableSetJoin', 
      'type' => 'INNER', 
      'conditions' =>'DeliverableSetJoin.store_id = Store.id' 

     ), 

     array(
      'table' => 'cities_deliverable_sets', 
      'alias' => 'CityDeliverableSetJoin', 
      'type' => 'INNER', 
      'conditions' =>'CityDeliverableSetJoin.deliverable_set_id = DeliverableSetJoin.id' 
      ), 
      array(
      'table' => 'cities', 
      'alias' => 'CityJoin', 
      'type' => 'INNER', 
      'conditions' =>'CityDeliverableSetJoin.city_id = CityJoin.id' 
     ) 
    ), 
    'conditions' => array(
     'Store.id' => 18 
    ), 
    'fields' => array('DeliverableSetJoin.id', 'Store.id','CityJoin.id'), 
    'order' => 'Store.created DESC' 
)); 

結果:

'SELECT `DeliverableSetJoin`.`id`, `Store`.`id`, `CityJoin`.`id` FROM `directorylisting`.`stores` AS `Store` 
INNER JOIN `directorylisting`.`deliverable_sets` AS `DeliverableSetJoin` ON (`DeliverableSetJoin`.`store_id` = `Store`.`id`) 
INNER JOIN `directorylisting`.`cities_deliverable_sets` AS `CityDeliverableSetJoin` ON (`CityDeliverableSetJoin`.`deliverable_set_id` = `DeliverableSetJoin`.`id`) INNER JOIN `directorylisting`.`cities` AS `CityJoin` ON (`CityDeliverableSetJoin`.`city_id` = `CityJoin`.`id`) WHERE `Store`.`id` = 18 ORDER BY `Store`.`created` DESC'