题
我的查询是这样的:
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
如何能得到在这里发挥作用。
通过使用范围,还可以插入一些更复杂的标准,仍然保持你的搜索条件的可读性。
这是非常强大的。我没有看到这个完整的“教程”之中;我种从源代码结束本。