我有一个包含数十万个寄存器的表。我正在使用Zend Framework 3和Doctrine 2制作一个具有搜索功能的分页页面。我的问题是我想将寄存器总数限制为 500 个,与搜索参数和分页无关。
在控制器上:
// This will return the result of DQL
$registros = $this->regService->getRegisters($searchParameters);
$adapter = new DoctrineAdapter(new ORMPaginator($registros, false));
$paginator = new Paginator($adapter);
$paginator->setDefaultItemCountPerPage(20);
$paginator->setCurrentPageNumber($page);
return new ViewModel([
'registros' => $paginator
]);
所以,问题是,如果我使用参数进行搜索,得到 2000 个寄存器,分页将返回所有这些寄存器,而我想做的是限制 500 个寄存器
感谢和最诚挚的问候
从代码中我不太确定你的问题在哪里;缺少getRegisters($param)
的实现。
但是,要实现分页,您走在正确的道路上。
请尝试以下操作:
$page = $this->params()->fromQuery('page', 1);
$itemsPerPage = $this->params()->fromQuery('itemsPerPage', null);
// I'm assuming your `getRegisters($param)` function returns QueryBuilder object
/** @var QueryBuilder $qb */
$qb = $this->getEntityManager()->createQueryBuilder();
// This query gets everything from Entity "Entity"
$qb->select('shortEntityName')
->from(NamespaceToEntity::class, 'shortEntityName');
// Create a Paginator, pass the QueryBuilder as parameter
$paginator = new Paginator(new OrmAdapter(new OrmPaginator($qb)));
// Set the current page (should be received from URL GET request)
$paginator->setCurrentPageNumber($page);
// Set the max items per page, defaulting to max of 500
$paginator->setItemCountPerPage($itemsPerPage ?: 500);
return [
'paginator' => $paginator,
];
除此之外,您还应该在用于分页导航的某个地方有一个"分页"部分模板,以便在视图中使用。此模板应适应您添加不同 GET 参数的方式,例如 &page=2
第二页或第二页&itemsPerPage=100
在页面上显示 100 个项目,而不是 500 个项目。
根据评论,略微修改了$paginator
上的最后一个功能。
// If using code above, you can discard getting "itemsPerPage" from URL, no longer required
// Set the current page (should be received from URL GET request)
$paginator->setCurrentPageNumber(($page <= 10) ? $page : 10); // max allowed = 10
// Set the max items per page, defaulting to max of 500
$paginator->setItemCountPerPage(50); // always 50 per page