我的查询是这样的:

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的作品,你是安全的。有很多时候,我不得不放弃Active Record的路程,只是得到的醇”理智的方式来完成工作。

我试图此查询为可读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是正确的,有时你不得不放弃活动记录窗外。如果你正在做大规模更新,其中通过众多型号的循环是效率极其低下的情况尤其如此。

只需使用CSqlDataProvider http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider

免责声明:我知道这不是准确的回答这个问题,particural,但它可能会帮助周围被赋予了问题的工作。我怀疑这个问题的主要目的在于获得方式使用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如何能得到在这里发挥作用。

通过使用范围,还可以插入一些更复杂的标准,仍然保持你的搜索条件的可读性。

这是非常强大的。我没有看到这个完整的“教程”之中;我种从源代码结束本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top