Zend 2 Paginator如何运作?

时间:2015-04-11 08:53:26

标签: php pagination zend-framework2 zend-paginator

我正在尝试理解Zend Paginator,并且最希望确保它不会破坏我的脚本。

例如,我有以下代码段,可以一次成功加载一些联系人:

$offset = 1;
//returns a paginator instance using a dbSelect;
$contacts = $ContactsMapper->fetchAll($fetchObj);

$contacts->setCurrentPageNumber($offset);
$contacts->setItemCountPerPage(1);

$allContacts = count($contacts);
while($allContacts >= $offset) {
    foreach($contacts as $contact) {
        //do something
    }
    $offset++;
    $contacts->setCurrentPageNumber($offset);
    $contacts->setItemCountPerPage(1);
}

但是,我可以在数据库中拥有数十万个联系人,并通过我发送给分页器的SELECT进行匹配。在这个例子中,我可以确定它一次只能加载一个吗?它是如何做到的,是否使用limitoffset运行自定义查询?

1 个答案:

答案 0 :(得分:1)

从官方文档:Zend Paginator Usage

  

注意

     
     

而不是选择给定查询的每个匹配行,DbSelect   适配器仅检索所需的最小数据量   显示当前页面。因此,第二个查询是   动态生成以确定匹配行的总数。

如果您使用Zend\Paginator\Adapter\DbSelect,它会将limitoffset应用于您传递的查询,并且只会获取所需的记录。这是在getItems()的{​​{1}}函数中完成的,您可以在源代码中看到these lines

您还可以从文档中阅读:

  

此适配器按顺序从数据库中获取所有记录   数数吧。相反,适配器操纵原始查询   生成相应的 COUNT 查询。 Paginator然后执行    COUNT 查询以获取行数。这确实需要额外的数据库往返,但这比它快许多倍   获取整个结果集并使用DbSelect,尤其是使用   大量数据。