2013-09-26 2 views
1

나는 containable을 사용하고 깊은 결부를하고 결과를 걸러 낼 필요가있다. 이 질문을 위해 우리가 자동차를 판매하고 있으며 기능별로 결과를 좁히고 싶다고 가정 해 봅시다.깊은 연관을위한 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

감사합니다. 라이오넬, 나는 둘 다 함께 사용할 수 있다는 것을 몰랐습니다 ... 이것은 많은 가능성을 열어줍니다! –