Activerecord 如何在Yii中禁用从相关模型获取数据
我不需要从相关模型中获取数据。 我有标杆 我也有模型评论 每个帖子都有评论。 我将模型之间进行关联,以便:Activerecord 如何在Yii中禁用从相关模型获取数据,activerecord,yii,Activerecord,Yii,我不需要从相关模型中获取数据。 我有标杆 我也有模型评论 每个帖子都有评论。 我将模型之间进行关联,以便: class Post public function relations() { return array( 'comments' => array(self::HAS_MANY, 'Comment', 'post_id') ); } public function scopes() {
class Post
public function relations()
{
return array(
'comments' => array(self::HAS_MANY, 'Comment', 'post_id')
);
}
public function scopes()
{
return array(
'orderDesc'=>array(
'order' => 'post_id DESC',
),
);
}
public function findAllPosts()
{
return $this->orderDesc()->findAll();
}
如果我从db得到帖子,我需要评论-没问题
Post::model()->findByPk()
但是如果我得到所有的帖子,我不需要评论
Post::model()->findAllPosts()
但我收到的帖子都有评论。我认为-这对数据库不好-使用额外的连接,我感兴趣的是如何禁用从相关模型获取数据
我尝试通过场景和方法关系中的更改行为来实现,但在方法关系中,我始终得到-$this->scenario为空。在Yii中,定义的关系默认为延迟加载。 这意味着只有在代码中调用相关模型时,Yii才会获取它们 所以如果你这样做了
Post::model()->findAll();
不会加载相关模型(即:注释)。但是如果你的电话
Post::model()->findAll();
CVarDumper::dump($posts[0]->comments);
然后将执行第二个DB请求以获取相关注释。这就是代码显示注释的原因
如果您知道您将需要一个相关模型,那么最好的解决方案是使用即时加载:它包括在加载初始模型的相同请求中加载相关模型。为此,您需要在代码中使用方法指定
例如:
Post::model()->with('comments')->findAll();
Post::model()->with('comments' => array('together' => false))->findAll();
使用
的方法也可以放在模型中定义的范围内或默认范围内。如果它在默认范围内,那么每次加载模型时,他的相关模型都将加载到相同的请求中
最后一点:
当您使用即时加载时,会执行一个请求来获取相关模型,但是这种技术不可能完美地适用于每个关系
例如,如果您有一个帖子
,并且希望加载作者
配置文件,因为只有一个作者
,请求将很快,只返回一行,因此快速加载效果良好
但是您需要加载注释
。因为它只执行一个请求,所以您将有几行包含许多类似的信息(所有关于post
的信息)。在这种情况下,纯渴望加载不是最佳解决方案。
处理这些关系的最佳方法是在关系数组中将参数一起指定为false。
如果您这样做,将执行2个请求:第一个请求获取帖子
,第二个请求获取相关的评论
例如:
Post::model()->with('comments')->findAll();
Post::model()->with('comments' => array('together' => false))->findAll();
来源:你是如何确定你确实收到了带有评论的帖子的?除非该关系包含在模型的defaultScope
中,或者使用和一起使用,否则它不会自动加载;CVarDumper::dump($posts[0]->comments)我得到了这篇帖子的评论,这是因为Yii。如果您不访问注释
,则不会加载该注释。