7
votes

You must have seen the following feature (on facebook), a post with some comments, each comment has a like counter.

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

In laravel it would be something like

  • Post hasMany Comment
  • Comment belongsTo Post
  • CommentLike belongsTo User
  • CommentLike belongsTo Comment
  • Comment hasMany CommentLike

So, now I want to get 10 posts with their comments, with the like counter per comment.

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

This does not work at all.

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

This counts all comments for each post, I want to count all likes per comment on each post.

4

4 Answers

22
votes

Try this

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

The other answers on this question are correct, but there seems to be a typo in them. They have all forgotten the starting "[" before 'comments', so the correct code snippet is the following:

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

   $query->withCount('likes');

}])->take(10)->get();
1
votes

I'm making an assumption CommentLike represents a comment_likes table

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();
1
votes

This will work.

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

   $query->withCount('likes');

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

You can access likes count by $post->comments->likes_count;