假设我需要获得一个包含评论数的帖子。当然,有许多方法可以做到这一点。最好的(或首选的)方法是什么?
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.
}
public function getCachedCommentsCountAttribute()
{
return Cache::remember($this->getTable() . '.' . $this->getKey() . '.comments_count', 60*60*24, function () {
return $this->comments()->count(); // posts.{id}.comments_count
});
}
最佳的性能选择是什么?
答案 0 :(得分:0)
为什么两者都不是?
您可以将计数缓存更短的时间,然后,当缓存过期时,只需执行查询即可获取更新的计数。
您还可以通过使用Eloquent Observers来永久缓存计数并仅在插入或删除注释时才使缓存无效,从而对该方法进行了一些调整。如果您知道仅将使用Eloquent方法来插入或删除注释,则可以使用此方法。例如,如果您进行批量插入或执行原始查询以删除评论,则不会触发事件。