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。如果您不访问
注释
,则不会加载该注释。