2013-09-26 7 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 подходит только для того, чтобы указать, какие модели вы хотели бы включить при извлечении данных, но не ограничивая родительскую модель от получения данных вообще. Один очевидный симптом заключается в том, что иногда ваши родительские данные могут содержать некоторые данные, содержащиеся в данных .

Итак, чтобы достичь этого, я думаю, что мы должны использовать 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

Спасибо, Лайонел, я не знал, что вы можете использовать оба вместе ... это открывает множество возможностей! –

Смежные вопросы