如果一篇文章没有评论,那么使用
Post::model()->with('comments')->findAll();
这样的一个查询,将查不到此文章。而如果使用
Post::model()->findAll();
则没有问题。
对于有评论的文章,两个都是可以检索到的。
why?
如果一篇文章没有评论,那么使用
Post::model()->with('comments')->findAll();
这样的一个查询,将查不到此文章。而如果使用
Post::model()->findAll();
则没有问题。
对于有评论的文章,两个都是可以检索到的。
why?
下等的应该是使用了lazy查寻,会做多步SQL。不是一下子查出来的。
而第一种写法应该是只有一个SQL。
试着看LOG里的SQL是不是这样的。
原因找到了,是因为comments里写了个
‘condition’=>‘comments.status=1’
的原因。如果不加这个condition就没有问题了。
可问题依旧:
如果我想找到所有的文章(无论有无评论),而comments只检索状态为status=1的,我又想用with以减少Sql的查询数,如此那么我该怎么办?
comments应该用’on’=>‘comments.status=1’,不然的话条件放到where里会导致对整个结果进行过滤。
谢谢qiang,这样的话问题解决。但发现了另外一个问题,见下一个回复:
使用scopes也可以解决这个问题
Post::model()->with('comments:passedfilter')->findAll();
在comments里加上
public function scopes() {
return array(
'passedfilter'=>array(
'condition'=>'comments.status=1', //我发现这里使用condition或者on产生的Sql是一样的
),);
}
但是如果我把scopes里condition换成’condition’=>'t.status=1’就不行。
同时我的post里存在status,所以不能用status=1。
问题出来了,如果我想在comments直接使用passedfilter;或者其它地方也用了到了passedfilter,但relations的name不叫comments,那么是否意味着我将不得不为他们每个都在scopes单独建立一项?
你可以在scope用$this->tableAlias得到当前使用的alias
那关于on 和 conditon 在scopes里生成的sql一样是设计预期中的吗?
如果你没有join其它table,那么on会被当作condition处理。这是设计预期的。
明白了,谢谢qiang