我正在尝试理解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
进行匹配。在这个例子中,我可以确定它一次只能加载一个吗?它是如何做到的,是否使用limit
和offset
运行自定义查询?
答案 0 :(得分:1)
从官方文档:Zend Paginator Usage
注意强>
而不是选择给定查询的每个匹配行,
DbSelect
适配器仅检索所需的最小数据量 显示当前页面。因此,第二个查询是 动态生成以确定匹配行的总数。
如果您使用Zend\Paginator\Adapter\DbSelect,它会将limit
和offset
应用于您传递的查询,并且只会获取所需的记录。这是在getItems()
的{{1}}函数中完成的,您可以在源代码中看到these lines。
您还可以从文档中阅读:
此适配器不按顺序从数据库中获取所有记录 数数吧。相反,适配器操纵原始查询 生成相应的 COUNT 查询。 Paginator然后执行 COUNT 查询以获取行数。这确实需要额外的数据库往返,但这比它快许多倍 获取整个结果集并使用
DbSelect
,尤其是使用 大量数据。