AR with 疑惑

如果一篇文章没有评论,那么使用


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里会导致对整个结果进行过滤。

:rolleyes: 谢谢qiang,这样的话问题解决。但发现了另外一个问题,见下一个回复:

@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 :)