【问题标题】:Laravel 6.x - Cache 'pagination()'Laravel 6.x - 缓存'分页()'
【发布时间】: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);

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

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

我想缓存这些查询,问题是:从App\User::paginate(15) 有没有办法获取将要执行的 sql(s)? 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 的问题。

谢谢。

【问题讨论】:

    标签: laravel caching redis laravel-6


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 2015-07-11
      • 2020-04-05
      • 2016-01-02
      • 2020-04-25
      • 2020-03-30
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多