2013-09-26 104 views
1

我有一些深度關聯使用可容納並需要篩選結果。爲了這個問題,我們假設我們正在銷售汽車,並希望通過功能縮減結果。CakePHP深度關聯條件

汽車的hasMany做出的hasMany模型HABTM功能

$options = array( 
    'order' => array('Car.price'), 
    'contain' => array(
     'make', 
     'model' => array(
      'order' => 'Model.name ASC' 
     ), 
     'features' 
    ) 
); 
$cars = $this->Car->find('all', $options); 

我將如何去排除所有的汽車,沒有電動車窗(Features.name!= power_windows)。

回答

3

Containable僅適用於指定在提取數據時要包含哪些模型,但不限制父模型根本無法提取數據。一個明顯的症狀是,有時您的父母數據可能包含一些null包含的數據。

因此,要實現它,我覺得應該用joins這裏,所以你可以指定條件:

$options = array(
    'order' => array('Car.price'), 
    'contain' => array(
     'make', 
     'model' => array(
      'order' => 'Model.name ASC' 
     ), 
     'features' 
    ), 
    'joins' => array(
     array(
      'table' => 'features', 
      'alias' => 'Feature', 
      'type' => 'LEFT', 
      'conditions' => array(
       'Car.id = Feature.car_id' 
      ) 
     ) 
    ), 
    'conditions' => array(
      'Features.name !=' => 'power_windows', 
    ) 
); 

但是這一個缺點是,你可能有重複Car由於加入。這是一個單獨的問題;)

+1

謝謝萊昂內爾,我不知道你可以一起使用這兩個......這開闢了很多的可能性! –