Zf2 Pagination 获取所有记录
Zf2 Pagination fetches all records
我实现了 zf2 分页器。但是现在随着数据的增加,我意识到它首先获取所有记录,然后进行分页,这需要更多时间。直到记录超过1k我才意识到速度问题。
分页器真的是这样工作的吗,还是我的代码遗漏了什么?
$photos = $em->getRepository('User\Entity\MyEntity')->findBy(array('id' => $main_id, 'status' => '1', 'is_primary' => '1'));
/** Create Paginator * */
$paginator = new \Zend\Paginator\Paginator(new
\Zend\Paginator\Adapter\ArrayAdapter($photos)
);
if (isset($data['pg_id'])) {
$paginator->setCurrentPageNumber($data['pg_id']);
} else {
$paginator->setCurrentPageNumber(1);
}
$paginator->setDefaultItemCountPerPage(25);
正如@foozy 在评论中提到的,Doctrine 为此目的为 ZF2 提供了分页器适配器。您可以使用 the Selectable adapter from DoctrineModule
directly or the DoctrinePaginator
class from DoctrineORMModule
. The latter doesn't have it's own documentation but this blog post from Loft Digital explains it well:
use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as DoctrineAdapter;
use Doctrine\ORM\Tools\Pagination\Paginator as ORMPaginator;
use Zend\Paginator\Paginator;
// .......
$entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
$repository = $entityManager->getRepository('Admin\Entity\SystemUser');
$adapter = new DoctrineAdapter(new ORMPaginator($repository->createQueryBuilder('user')));
$paginator = new Paginator($adapter);
// .......
我实现了 zf2 分页器。但是现在随着数据的增加,我意识到它首先获取所有记录,然后进行分页,这需要更多时间。直到记录超过1k我才意识到速度问题。
分页器真的是这样工作的吗,还是我的代码遗漏了什么?
$photos = $em->getRepository('User\Entity\MyEntity')->findBy(array('id' => $main_id, 'status' => '1', 'is_primary' => '1'));
/** Create Paginator * */
$paginator = new \Zend\Paginator\Paginator(new
\Zend\Paginator\Adapter\ArrayAdapter($photos)
);
if (isset($data['pg_id'])) {
$paginator->setCurrentPageNumber($data['pg_id']);
} else {
$paginator->setCurrentPageNumber(1);
}
$paginator->setDefaultItemCountPerPage(25);
正如@foozy 在评论中提到的,Doctrine 为此目的为 ZF2 提供了分页器适配器。您可以使用 the Selectable adapter from DoctrineModule
directly or the DoctrinePaginator
class from DoctrineORMModule
. The latter doesn't have it's own documentation but this blog post from Loft Digital explains it well:
use DoctrineORMModule\Paginator\Adapter\DoctrinePaginator as DoctrineAdapter;
use Doctrine\ORM\Tools\Pagination\Paginator as ORMPaginator;
use Zend\Paginator\Paginator;
// .......
$entityManager = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
$repository = $entityManager->getRepository('Admin\Entity\SystemUser');
$adapter = new DoctrineAdapter(new ORMPaginator($repository->createQueryBuilder('user')));
$paginator = new Paginator($adapter);
// .......