Как сделать критерии со сложным запросом в рамках Yii?

StackOverflow https://stackoverflow.com/questions/4021890

  •  26-09-2019
  •  | 
  •  

Вопрос

У меня есть такое запрос:

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, вы также можете вставить некоторые более сложные критерии и все еще сохраняют состояние поиска.

Это довольно мощный. Я не видел полного «учебника» по этому поводу этого; Я своего рода заключил это из исходного кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top