метод 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')
));