Laravel 6.x-缓存'pagination()'

我正在使用Laravel分页(https://laravel.com/docs/6.x/pagination#paginating-eloquent-results) 像这样:

// the Controller contains
$users = App\User::paginate(15);

运行此代码,我注意到执行了两个查询:

  1. 要获取总项目数:select count(*) as aggregate from user
  2. 要获取前15个项目:select * from user limit 15 offset 0

我想缓存此查询,问题是:从App\User::paginate(15)可以获取将要执行的 sql 吗? select count(*) as aggregate from userselect * from user limit 15 offset 0

代码App\User::paginate(15)返回一个LengthAwarePaginator类;我可以从此类中执行 sql 吗?

这个想法是创建我自己的方法来缓存此分页请求。像这样:

// the Model contains
public static function paginateWithQueryCache($itemPerPage) {
   $query = self::query();
   $cacheKeyString = $query->toSql();
   $cacheKeyStringMD5 = md5($cacheKeyString);
   return \Cache::remember($cacheKeyStringMD5,60,function() use ($itemPerPage) {
            return self::paginate($itemPerPage);
        });
}
// the Controller will be update with
$users = App\User:: paginateWithQueryCache(15);

这里的问题是,用作缓存键的$query->toSql()是对模型(select * from user)的简单查询,而不是分页查询(select * from user limit 15 offset 0);这是切换到第二页 page = 2 的问题。

谢谢。

kxp1125 回答:Laravel 6.x-缓存'pagination()'

select count(*) as aggregate from user执行查询Illuminate\Database\Query::getCountForPagination()(在我的数据库表中有数百万条记录的情况下,这非常慢),然后要对其进行缓存,我需要扩展该类并实现缓存

我改变了方法,决定缓存所有分页输出:

    // Controller
    public function paginateCache($model,$cacheExpireInSeconds = 120) 
    {
        $cacheKeyString = request()->fullUrl();
        $cacheKeyStringMD5 = md5($cacheKeyString);

        /* Closure to get data */
        $func_get_data = function() use ($model) {
            return $model::paginate(1000);
        };

        /* Caching */
        return \Cache::remember($cacheKeyStringMD5,$cacheExpireInSeconds,$func_get_data);
    }

    public function index()
    {
        return $this->paginateCache(User::class);
    }
本文链接:https://www.f2er.com/3116502.html

大家都在问