我有这样的查询:
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;
Run Code Online (Sandbox Code Playgroud)
我尝试使用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);
Run Code Online (Sandbox Code Playgroud)
在这一点上,您可能只是编写一个常规的SQL语句,但这样做可能会有一些好处:绑定参数,合并条件,添加其他条件等.
只要你的普通SQL工作,你就是安全的.有很多次我不得不把Active Record扔掉,只是以更加理智的方式完成工作.
我试图将此查询转换为可读的CDbCriteria结构.馊主意.Yii在查询复杂数据方面很糟糕.