【问题标题】:Laravel n+ issue eager loading count()Laravel n+ 发出急切加载计数()
【发布时间】:2015-03-20 20:09:55
【问题描述】:

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

我有 2 个模型发布、评论。一个帖子有很多个cmet,一个评论属于一个帖子

当我循环浏览所有帖子时,我想显示它们包含多少 cmets 的计数。我已经能够很好地做到这一点。但问题是2个查询。

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

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

谢谢

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    更新

    从 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

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

    【讨论】:

    • 谢谢,这正是我所需要的。真的很感激。
    • @hooligan 我知道这个问题/答案已经很老了,但我已经用新信息更新了我的答案。
    【解决方案2】:

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

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

    或在 cmets 模型中:

    public function create( $commentData ){
    
        $result = $this->fill( $commentData );
        $this->post()->increment('num_comments');
    
        return $result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-13
      • 2021-04-23
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多