gpt4 book ai didi

CakePHP 3.x : Cache paginated search

转载 作者:行者123 更新时间:2023-12-01 22:26:52 25 4
gpt4 key购买 nike

我需要在我的 CakePHP 3 分页搜索中缓存分页结果。

当我使用 CakePHP 2.x 时,我能够覆盖 appModel 中的分页功能。是否可以使用新的 CakePHP ORM 实现相同的结果?因为 $query->cache() 在分页查询对象中不起作用。

我已经阅读了一些关于这个主题的讨论,但如果可能的话我需要一个例子。

最佳答案

对查询进行分页

问题中没有显示代码,但我们假设您从一个简单的烘焙 Controller 索引操作开始:

public function index()
{
$this->set('posts', $this->paginate($this->Posts));
$this->set('_serialize', ['posts']);
}

首先,认识到 Controller 方法分页 accepts a table or query object - 如果传递了一个表对象,则分页器组件 simply calls find使用查询对象。所以,上面的代码在功能上等同于:

public function index()
{
$query = $this->Posts->find();

$this->set('posts', $this->paginate($query));
$this->set('_serialize', ['posts']);
}

使用查询缓存的方法

只需对上述代码稍作修改即可使用查询的缓存方法:

public function index()
{
$query = $this->Posts->find();

$cacheKey = $this->name . '_' . md5(json_encode($this->request->query));
$query->cache($cacheKey);

$this->set('posts', $this->paginate($query));
$this->set('_serialize', ['posts']);
}

查询参数和 Controller 名称用于生成唯一的缓存键,以便一次调用分页的缓存结果不会与其他请求的缓存结果混淆。

注意计数

以这种方式使用时仍会发出计数,如果这是一个问题,仍然可以通过定义 a counter callback 来避免。 :

public function index()
{
$query = $this->Posts->find();

$cacheKey = $this->name . '_' . md5(json_encode($this->request->query));
$searchTerms = []; // define this
$countCacheKey = $this->name . '_' . md5(json_encode($searchTerms)) . '_count';

$query
->cache($cacheKey)
->counter(function($query) use ($countCacheKey) {
return Cache::remember($countCacheKey, function() use ($query) {
return $query->count();
});
});


$this->set('posts', $this->paginate($query));
$this->set('_serialize', ['posts']);
}

即简单地将对 count 方法的调用包装在 Cache::remember 中。

请注意,答案中用于计数的缓存键对于所有请求都是相同的,因为在此示例中要分页的行数对于所有请求都是相同的。例如,如果您正在对搜索进行分页 - 搜索词应该用于计数缓存键。

关于CakePHP 3.x : Cache paginated search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32948849/

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