gpt4 book ai didi

Laravel 6.x - 缓存 'pagination()'

转载 作者:行者123 更新时间:2023-12-02 06:55:11 24 4
gpt4 key购买 nike

我正在使用 Laravel 分页 ( https://laravel.com/docs/6.x/pagination#paginating-eloquent-results )像这样:

// the Controller contains
$users = App\User::paginate(15);

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

  1. 要获取总项目数:选择 count(*) 作为用户的聚合
  2. 要获取前 15 项:select * from user limit 15 offset 0

我想缓存此查询,问题是:从 App\User::paginate(15) 有没有办法获取 sql( s) 将被执行? select count(*) 作为来自用户的聚合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 时出现问题。

谢谢。

最佳答案

查询select count(*) asAggregate from user(在我的情况下,数据库表中有数百万条记录,这非常慢)是从Illuminate\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);
}

关于Laravel 6.x - 缓存 'pagination()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58821151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com