我正在使用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 吗? 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 的问题。
谢谢。