Laravel n +发出急切加载计数()

时间:2015-01-22 05:37:18

标签: php laravel eloquent

我正在浏览我的laravel应用程序并尝试修复我能找到的任何n +问题。我遇到过一个场景,它不是真正的n +但不知道该怎么称呼它。

我有2个型号发布,评论。帖子有很多评论,评论属于帖子

当我遍历我的所有帖子时,我想显示它们包含多少条评论的计数。我已经能够做到这一点。但问题是2个查询。

如何更新以下Eloquent查询以添加注释计数列。

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

由于

2 个答案:

答案 0 :(得分:7)

更新

从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有一篇很好的博客文章可以满足您的需求。查看文章here

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

答案 1 :(得分:0)

要么只是对关系使用计数,要么你认为有必要,你可以添加一个' num_comments'到Post模型并在创建评论时增加它:

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

或在评论模型中:

public function create( $commentData ){

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

    return $result;
}