Laravel n+问题中的急切加载count()

3
我正在检查我的Laravel应用程序并尝试修复我能找到的任何n+问题。我遇到了一个场景,它不是真正的n+,但不确定该如何称呼它。
我有2个模型:Post和Comment。一个帖子有多条评论,而一条评论属于一个帖子。
当我循环遍历所有我的帖子时,我想显示它们包含的评论数量。我已经成功地做到了这一点。但问题是它需要两个查询。
如何更新以下Eloquent查询以添加评论计数列。
Post::where('status', 1)->get();

谢谢

2个回答

8

更新

从 Laravel 5.2.32 开始,查询构建器中添加了一个新方法来帮助解决这个问题。当您在查询中添加 withCount($relation) 方法时,它将向结果添加一个 {relation}_count 字段,其中包含所提供关系的数量。

因此,您的查询应该是:

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

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

你可以在这里的文档中了解更多相关信息。

翻译后

@JarekTkaczyk写了一篇很好的博客文章,可以实现你正在寻找的功能。请看这里的文章

基本上,你将创建一个包含帖子评论计数的关系,并且将预加载该关系(从而避免n+1问题)。他还为通过属性访问器访问计数添加了一些语法糖。


非常感谢,这正是我所需要的。非常感激。 - hooligan
1
@hooligan 我知道这个问题/答案很旧了,但我已经更新了我的答案并添加了新信息。 - patricus

0
要么只在关系上使用count,要么如果你认为有必要,可以在Post模型中添加'num_comments'并在评论创建时递增它:
$post->comments()->count();

或者在评论模型中:

public function create( $commentData ){

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

    return $result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接