Laravel 6.x-缓存“分页()”

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

我正在使用Laravel分页 像这样:

// 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);
    }