问题描述
我有一个包含不同版本文本的表格。我想显示每个版本与以前版本的差异。我还想对版本进行分页,以防超过 20 个。但是,要区分每页上的最后一个文本,我需要下一页的第一个文本。我不能只是将页面大小变大(在这种情况下为 21),因为第二个页面将跳过其第一个实体,而第三个将跳过其前两个实体,以此类推。
$config = $this->Paginator->getConfig();
$this->Paginator->setConfig('limit',$config['limit'] + 1);
$inscriptions = $this->paginate($query);
我或许可以通过对单个实体进行单独的 ->paginate()
调用来解决问题,但如果可能,我宁愿不执行第二个查询。
$inscriptions = $this->paginate($query);
$config = $this->Paginator->getConfig();
$this->Paginator->setConfig([
'limit' => 1,'page' => ($config['page'] * $config['limit']) + 1
]);
$inscriptions[] = $this->paginate($query)->first();
有没有办法跳过前 n 个结果?在这种情况下,我可以将页面大小设置为 21,但将页码设置为 1,并跳过第一个 ((old page number - 1) * old page size) 实体。
解决方法
可以制作一个扩展默认分页器的自定义分页器,但功能如下所述:
<?php
namespace App\Datasource;
use Cake\Core\InstanceConfigTrait;
use Cake\Datasource\Paginator;
use Cake\Datasource\QueryInterface;
use Cake\Datasource\RepositoryInterface;
class DiffPaginator extends Paginator
{
use InstanceConfigTrait;
protected function getQuery(RepositoryInterface $object,?QueryInterface $query = null,array $data): QueryInterface
{
$data['options']['offset'] = ($data['options']['page'] - 1) * $data['options']['limit'];
$data['options']['limit'] += 1;
unset($data['options']['page']);
return parent::getQuery($object,$query,$data);
}
protected function buildParams(array $data): array
{
$paging = parent::buildParams($data);
if ($paging['current'] == $paging['perPage'] + 1) {
$paging['current'] -= 1;
}
return $paging;
}
}
然后在您的控制器中使用以下内容:
$this->Paginator->setPaginator(new DiffPaginator);