Laravel 5.6-有效获取关系计数和updated_at列的最后一个值

时间:2018-08-23 14:02:34

标签: mysql laravel-5 eloquent eager-loading

假设我将PostsComments定义为:

Post.php

public function comments()
{
  return $this->hasMany('App\Comment');
}

Comment.php

public function post()
{
  return $this->belongsTo('App\Post');
}

我想有效地加载带有number of comments和最后更新的评论的updated_at列的Post。我将如何进行?

我能想到的最好的方法是将所有评论都加载到Post中,但是将对{Selects of Comments}的选择限制在post_idupdated_at列中。然后在视图中计数已加载的注释以获取计数,并使用sortByDesc('updated_at')->first()获取最后一列的日期:

MyController.php

Post::with([
  'comments' => function($q) {
    $q->select('post_id','updated_at');
  }
])->get();

my_view.blade.php

Comments count: {{ $posts->comments->count() }}
Last comment: {{ $posts->comments->sortByDesc('updated_at')->first()->updated_at }}

是否有一种方法可以更有效地执行此操作,并且仅获得最新comments.updated_at列的评论数和值?

MySQL或口才解决方案还可以。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用withCount()来实现这两者:

Post::withCount([
    'comments',
    'comments as last_comment' => function($q) {
        $q->select(DB::raw('max(updated_at)'));
    }
])->get();

Comments count: {{ $post->comments_count }}
Last comment: {{ $post->last_comment }}