Как сделать критерии со сложным запросом в рамках Yii?
Вопрос
У меня есть такое запрос:
SELECT * FROM activity
WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))
AND activityType IN(1, 2, 3))
OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))
ORDER BY id DESC;
Я пытаюсь использовать model()->findAllBySql($sql)
И это работает. Но я хочу сделать это, используя CDbCriteria
, Если у вас есть еще одно решения, дайте мне знать: D
Решение
Вы все равно можете построить это утверждение с CDBCRITERIA, я думаю ... что-то вроде:
$criteria=new CDbCriteria;
$criteria->condition = '
(
(
userId = 1 OR
userId IN (SELECT userId FROM follower WHERE followerId = 1)
)
AND activityType IN(1, 2, 3)
)
OR (
targetId = 24
AND aType IN(1, 2, 3, 4, 5)
)
';
$criteria->order = 'id DESC';
$results=Activity::model()->findAll($criteria);
Как этот момент вы также можете просто написать обычное заявление SQL, но могут возникнуть некоторые преимущества для этого: обязательные параметры, слияние критериев, добавление дополнительных критериев и т. Д.
Другие советы
Пока ваша простая SQL работает, вы в безопасности. Есть много раз, когда я должен бросить активную запись, и просто проделать работу, проводимую в ольтере.
Я пытался перевести этот запрос в читаемую конструкцию CDBCRITERIA. Плохая идея. Yii отстой, когда дело доходит до запросов сложных данных.
Ответ можно найти здесь:http://www.yiiframework.com/doc/guide/1.1/en/database.dao#executing-sql-statements.
В твоем случае:
$sql = 'SELECT * FROM activity';
$sql .= 'WHERE (((userId = 1 OR userId IN(SELECT userId FROM follower WHERE followerId = 1))';
$sql .= 'AND activityType IN(1, 2, 3))';
$sql .= 'OR (targetId = 24 AND aType IN(1, 2, 3, 4, 5)))';
$sql .= 'ORDER BY id DESC';
$connection = Yii::app()->db;
$command = $connection->createCommand($sql);
$results = $command->queryAll();
@pestaa - это правильно, что иногда вы должны бросить активную запись в окно. Это особенно верно, если вы выполняете массы обновлений, где цикл через многочисленные модели ужасно неэффективны.
Просто используйте CsqldataProviderhttp://www.yiiframework.com/doc/api/1.1/csqldatataProvider.
Отказ от ответственности: Я знаю, что это не точный ответ на этот частичностный вопрос, но это может помочь обойтись по этой проблеме. Я подозреваю, что основной целью этого вопроса является получение способа использования CGRIDVIEW, CLISTVIEW и т. Д. С произвольным SQL.
я использую CDbCriteria
для сложных запросов, в которых я использую with
характерная черта.
Вы можете строить сложные критерии, как это:
$dbCriteria->with=array(
'<relation1>'=>array( 'condition'=>'<condition for given relation>',
'with'=>array('<relation2:relation of relation1>'
=>array(<conditions for relation2>)
)
'scopes'=><scopes for relation1>
)
);
Я не проверил, как OR
может войти в игру здесь.
Используя SCOPES, вы также можете вставить некоторые более сложные критерии и все еще сохраняют состояние поиска.
Это довольно мощный. Я не видел полного «учебника» по этому поводу этого; Я своего рода заключил это из исходного кода.