在laravel中获取相关模型的数量

时间:2019-11-26 19:15:28

标签: laravel eloquent laravel-query-builder

假设我需要获得一个包含评论数的帖子。当然,有许多方法可以做到这一点。最好的(或首选的)方法是什么?

  1. 急于加载+并带有路径模型绑定,以便在将模型注入路径时获取计数。
class Post extends Model {

    protected $withCount = [ 'comments' ];

    public function comments() 
    { 
         return $this->hasMany();
    }

}
Route::get('/posts/{post}', function (App\Post $post) {

    return $post;  // $post→comments_count gives count.

} 
  1. 缓存计数
public function getCachedCommentsCountAttribute()
{
    return Cache::remember($this->getTable() . '.' . $this->getKey() . '.comments_count', 60*60*24, function () {
        return $this->comments()->count();  // posts.{id}.comments_count
    }); 
}

  1. 其他

最佳的性能选择是什么?

1 个答案:

答案 0 :(得分:0)

为什么两者都不是?
您可以将计数缓存更短的时间,然后,当缓存过期时,只需执行查询即可获取更新的计数。

您还可以通过使用Eloquent Observers来永久缓存计数并仅在插入或删除注释时才使缓存无效,从而对该方法进行了一些调整。如果您知道仅将使用Eloquent方法来插入或删除注释,则可以使用此方法。例如,如果您进行批量插入或执行原始查询以删除评论,则不会触发事件。