Laravel 6.x-缓存“分页()”
我正在使用Laravel分页 像这样:Laravel 6.x-缓存“分页()”,laravel,caching,redis,laravel-6,Laravel,Caching,Redis,Laravel 6,我正在使用Laravel分页 像这样: // the Controller contains $users = App\User::paginate(15); 运行此代码时,我注意到执行了两个查询: 要获取项目总数:请从用户处选择count*作为聚合 要获取前15个项目:请选择*from user limit 15 offset 0 我想缓存这些查询,问题是:从App\User::paginate15有没有一种方法可以获取将要执行的SQL?选择count*作为用户的聚合,并选择*作为用户限制1
// the Controller contains
$users = App\User::paginate(15);
运行此代码时,我注意到执行了两个查询:
要获取项目总数:请从用户处选择count*作为聚合
要获取前15个项目:请选择*from user limit 15 offset 0
我想缓存这些查询,问题是:从App\User::paginate15有没有一种方法可以获取将要执行的SQL?选择count*作为用户的聚合,并选择*作为用户限制15偏移量0
代码App\User::paginate15返回一个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);
});
}
这里的问题是,用作缓存键的$query->toSql是对模型select*from user的简单查询,而不是分页查询select*from user limit 15 offset 0;切换到第二页(第2页)时出现问题
谢谢。在我的例子中,数据库表中有数百万条记录的情况下,查询select count*as AGGRATE from user非常慢,它是从LIGHAME\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);
}
// 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);
}