Eloquent Count 嵌套关系与嵌套预加载

Posted

技术标签:

【中文标题】Eloquent Count 嵌套关系与嵌套预加载【英文标题】:Eloquent Count nested relationships with nested eager loading 【发布时间】:2017-11-19 20:08:33 【问题描述】:

你一定看过以下功能(在facebook上),一个帖子有一些cmets,每个评论都有一个like counter。

https://img4.hostingpics.net/pics/67853820170616003640LaravelNewsAccueil.png

在 laravel 中它会像

发表有很多评论 评论属于帖子 CommentLike 属于用户 CommentLike 属于评论 评论有很多评论喜欢

所以,现在我想用他们的 cmets 获得 10 个帖子,每个评论都有点赞计数器。

Post::with('comments')->withCount('comments.likes')->take(10)->get();

这根本不起作用。

Post::with('comments')->withCount('comments')->take(10)->get();

这会计算每个帖子的所有 cmets,我想计算每个帖子的每条评论的所有点赞数。

【问题讨论】:

【参考方案1】:

试试这个

Post::with(['comments' => function($query)
   $query->withCount('likes');
])->take(10)->get();

【讨论】:

有没有办法获得喜欢的总数而不是每条评论的计数?能够通过$post->likes_count 或类似方式获得的东西【参考方案2】:

关于这个问题的其他答案是正确的,但似乎有错字。他们都忘记了'cmets'之前的起始“[”,所以正确的代码sn-p如下:

Post::with(['comments' => function($query)

   $query->withCount('likes');

])->take(10)->get();

【讨论】:

【参考方案3】:

这会起作用。

Post::with('comments' => function($query)

   $query->withCount('likes');

])->take(10)->get();

您可以通过$post->comments->likes_count;访问点赞数

【讨论】:

【参考方案4】:

我假设CommentLike 代表comment_likes

Post::with('comments' => function($query)
    $query->select('comment_likes.*')
          ->join('comments', 'comments.id', '=', 'comment_likes.comment_id')
          ->groupBy('comments.id')    
          ->havingRaw('sum(comment_likes.id) as likes')
])->take(10)->get();

【讨论】:

很好,我会试试这个!但是没有“雄辩”的方式来做到这一点吗?没有原始查询? 我不知道 sum(...) 函数。

以上是关于Eloquent Count 嵌套关系与嵌套预加载的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 混合获取 Eloquent 急切加载嵌套多个模型

laravel eloquent - 在嵌套急切加载的关系上不使用

Laravel 使用自定义查询预加载嵌套关系

Laravel Eloquent 嵌套关系枢轴与约束

在 Eloquent 中嵌套一对多关系

与where子句查询的Eloquent嵌套关系在false条件下返回集合