【问题标题】:Limit the doctrine pagination total records in Zend Framework限制 Zend Framework 中的学说分页总记录
【发布时间】:2018-01-09 14:06:53
【问题描述】:

我有一个包含数十万寄存器的表。我正在使用 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 个寄存器中

感谢和问候

【问题讨论】:

    标签: php zend-framework doctrine-orm pagination


    【解决方案1】:

    从代码中我不太确定您的问题出在哪里;缺少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(\Namespace\To\Entity::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
    

    【讨论】:

    • 感谢您的回复。分页运行良好。问题是,如果查询返回超过 500 个寄存器,我想忽略它们。因此,如果重新调整 600 条记录,我应该只有 10 页,每页 50 条记录,其他 100 条应该被丢弃。
    • 我在应该为您提供的答案下方添加了一些内容。您需要自己设计一种方法来限制此页面在客户端的分页(最多 10 页,但后端会更正它)。
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2023-04-09
    • 2013-10-23
    • 2016-03-31
    相关资源
    最近更新 更多