我正在浏览我的laravel应用程序并尝试修复我能找到的任何n +问题。我遇到过一个场景,它不是真正的n +但不知道该怎么称呼它。
我有2个型号发布,评论。帖子有很多评论,评论属于帖子
当我遍历我的所有帖子时,我想显示它们包含多少条评论的计数。我已经能够做到这一点。但问题是2个查询。
如何更新以下Eloquent查询以添加注释计数列。
Post::where('status', 1)->get();
由于
答案 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;
}