Laravel n+ 问题预加载计数()

Laravel n+ issue eager loading count()

我正在检查我的 laravel 应用程序并尝试修复我能找到的所有 n+ 个问题。我遇到过一种情况,它不是真正的 n+,但不确定如何称呼它。

我有 2 个模型 Post,评论。一个post有很多评论,一个评论属于一个post

当我遍历所有 post 时,我想显示它们包含的评论数量。我已经能够很好地做到这一点。但问题是 2 个查询。

如何更新以下 Eloquent 查询以添加评论计数列。

Post::where('status', 1)->get();

谢谢

更新

自 Laravel 5.2.32 起,已将一种新方法添加到查询生成器中以帮助解决此问题。当您将 withCount($relation) 方法添加到查询时,它将向结果添加一个 {relation}_count 字段,其中包含所提供关系的计数。

因此,您的查询将是:

$posts = Post::where('status', 1)->withCount('comments')->get();

foreach($posts as $post) {
    echo $post->comments_count;
}

您可以在 documentation here 阅读更多内容。


原创

@JarekTkaczyk 有一个很好的博客 post 可以满足您的需求。查看文章 here

基本上,您将创建一个包含 post 的评论计数的关系,并且您将急切加载该关系(从而避免 n+1)。他还有一些语法糖可以通过属性访问器访问计数。

要么只对关系使用计数,要么如果您认为有必要,您可以将 'num_comments' 添加到 Post 模型并在创建评论时递增它:

$post->comments()->count();

或在评论模型中:

public function create( $commentData ){

    $result = $this->fill( $commentData );
    $this->post()->increment('num_comments');

    return $result;
}