【发布时间】:2020-03-08 07:24:38
【问题描述】:
我正在使用 Laravel 分页 (https://laravel.com/docs/6.x/pagination#paginating-eloquent-results) 像这样:
// the Controller contains
$users = App\User::paginate(15);
运行这段代码,我注意到执行了两个查询:
- 获取项目总数:
select count(*) as aggregate from user - 获取前 15 项:
select * from user limit 15 offset 0
我想缓存这些查询,问题是:从App\User::paginate(15) 有没有办法获取将要执行的 sql(s)? select count(*) as aggregate from user 和 select * 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 的问题。
谢谢。
【问题讨论】:
标签: laravel caching redis laravel-6