метод findAll по нескольким условиям

у меня 4 таблицы:

  • контент
  • отношения
  • теме
  • группа

содержание:

id(int)
title(varchar)
text(text)

тема:

id(int)
title(varchar)
prent_id(int)

группа:

id(int)
title(varchar)

отношения:

id(int)
content_id(int)
group_id(int)
subject_id(int)

отношения to контент is многие ко многим.

группа to контент is много много.

теме to контент is многие ко многим.

контент может принадлежать нескольким субъектам или нескольким группам.

Я хочу выполнить запрос примерно так:

select * from relation where group_id = 1,3 and subject_id = 1,4,6,7

2 ответов


можно использовать findAllByAttributes:

$relation_models = Relation::model()->findAllByAttributes(array(
        'group_id'=>array('2','3'),
        'subject_id'=>array('4','5','7')
    )
);

это даст вам что-то вроде (фактический запрос может содержать псевдоним):

select * from relation where group_id IN (1,3) and subject_id IN (1,4,6,7)

однако, если вы хотите : where group_id IN (1,3) OR subject_id IN (1,4,6,7) (i.e или вместо И) тогда вам придется использовать CDbCriteria:

$criteria = new CDbCriteria;
$criteria->condition = 'group_id IN (1,3) OR subject_id IN (1,4,6,7)'
$relation_models = Relation::model()->findAll($criteria);

вы также можете использовать addInCondition :

$criteria->addInCondition('group_id', array('1','2'), 'OR');
$criteria->addInCondition('subject_id', array('1','4','6','7'), 'OR');
$relation_models = Relation::model()->findAll($criteria);

не забудьте привязать параметры, если вы принимаете ввод от пользователя. Что-то вроде это:

$criteria->condition = 'group_id IN (:gid1, :gid2) OR subject_id IN (:sid1, :sid2, :sid3, :sid4)';     
$criteria->params = array(':gid1'=>$xyz,':gid2'=>'2',':sid1'=>$uvw,':sid2'=>$abc,':sid3'=>'6',':sid4'=>'7');
$relation_models = Relation::model()->findAll($criteria);

вы можете использовать с ()

имена исходных отношений будут в вашей модели отношений, если вы выберете опцию построить отношения на gii при создании модели.

    $relation_models = Relation::model()->with('contents','groups','subjects')->findAllByAttributes(array(
        'group_id'=>array('2','3'),
        'subject_id'=>array('4','5','7')
    ));