1

我不需要从相关模型中获取数据。我有模特帖子我也有模特评论。

每个帖子都有评论。我在模型之间建立关联,所以:

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 是空的。

4

1 回答 1

3

在 Yii 中,定义的关系默认是延迟加载的。这意味着 Yii 只有当你在代码中调用它们时才会获取相关模型。

所以如果你这样做

Post::model()->findAll();

不会加载相关模型(即:评论)。但如果你的电话

Post::model()->findAll();
CVarDumper::dump($posts[0]->comments);

然后将执行第二个数据库请求以获取相关评论。这就是代码显示注释的原因。

如果您知道您将需要一个相关模型,最好的解决方案是使用预加载:它包括在加载初始模型的同一请求中加载相关模型。为此,您需要with在代码中指定方法。

例子:

Post::model()->with('comments')->findAll();

此方法with也可以放在模型中定义的范围内或默认范围内。如果它在默认范围内,那么每次加载模型时,他的相关模型都会在同一个请求中加载。

最后一点:

当您使用急切加载时,会执行一个请求来获取相关模型,但这种技术并不适用于每个关系。

例如,如果你有一个post并且你想加载author配置文件,因为只有一个author,请求会很快,只返回一行,所以急切加载是好的。

但是你想加载comments. 由于它只执行一个请求,因此您将有几行包含许多类似信息(关于 的所有信息post)。在这种情况下,纯粹的急切加载并不是最好的解决方案。处理这些关系的最佳方法是在关系数组中将参数指定together为 false。如果这样做,将执行 2 个请求:第一个请求获取 the post,第二个请求获取相关的comments.

例子:

Post::model()->with('comments' => array('together' => false))->findAll();

来源:Yii 指南

于 2012-12-26T11:05:41.253 回答