1

ZF2 中的大多数情况下,我会做这样的分页器:

public function fetchAll()
{
 $resultSet = $this->tableGateway->select();
 return $resultSet;
}

$iteratorAdapter = new \Zend\Paginator\Adapter\Iterator($this->getSampleTable()->fetchAll());
$paginator = new \Zend\Paginator\Paginator($iteratorAdapter);

这个方法的问题是它不限制查询结果,并且 fetchAll 返回所有结果(在 db 和 php 之间产生大流量)。

在纯 php中,我会做这样的分页:

$PAGE_NUM = $_GET['page_num'];
$result_num = mysq_query("SELECT * FROM table WHERE some condition");
$result = mysq_query("SELECT * FROM table WHERE some condition LIMIT $PAGE_NUM, 20");
echo do_paginator($result_num, 20, $PAGE_NUM);//THIS JUST MAKE THE CLASSIC < 1 2 3 4 5 >

这样做的好处是,由于 mysql 中的 LIMIT 选项,我只从数据库中获取分页中需要的数据。这在返回太多记录的查询中表现良好。

我可以使用对结果有有效限制的 ZF2 分页器,还是我需要自己制作分页器?

4

1 回答 1

1

请改用Zend\Paginator\Adapter\DbSelect适配器,它完全符合您的要求,将限制和偏移量应用于您开始提供的查询,并仅获取这些记录。

此外,此适配器不会从数据库中获取所有记录以对它们进行计数。相反,适配器会操纵原始查询以生成相应的 COUNT 查询。Paginator 然后执行该 COUNT 查询以获取行数。这确实需要额外的数据库往返,但这比获取整个结果集并使用 count() 快很多倍,尤其是在处理大量数据时。

于 2013-04-19T14:54:55.680 回答