我将 Doctrine 2 与我的 Zend Framework 应用程序一起使用,典型的查询结果可能会产生一百万(或更多)的搜索结果。
我想根据这个结果集使用 Zend_Paginator。但是,我不想将所有结果作为数组返回并使用数组适配器,因为这会效率低下,而是我想向分页器提供总行数和基于限制/偏移量的结果数组.
使用 Array 适配器是否可行,或者我需要创建自己的分页适配器?
我将 Doctrine 2 与我的 Zend Framework 应用程序一起使用,典型的查询结果可能会产生一百万(或更多)的搜索结果。
我想根据这个结果集使用 Zend_Paginator。但是,我不想将所有结果作为数组返回并使用数组适配器,因为这会效率低下,而是我想向分页器提供总行数和基于限制/偏移量的结果数组.
使用 Array 适配器是否可行,或者我需要创建自己的分页适配器?
You will have to extend your own adapter. The Array adapter works the way you don't want - it receives an array and return a portion of it based on the current settings. What you'll need is a new adapter that will take DQL statemenet and set the limit/offset.
您不需要实现Zend_Paginator_Adapter_Interface,因为 Zend_Paginator_Adapter_Iterator 已经实现了它。
相反,可以像这样简单地将 Doctrine 的Paginator传递给Zend_Paginator_Adapter_Iterator:
use Doctrine\ORM\Tools\Pagination as Paginator; // goes at top of file
SomeController::someAction()
{
$dql = "SELECT s, c FROM Square\Entity\StampItem s JOIN s.country c ".' ORDER BY '. $orderBy . ' ' . $dir;
$query = $this->getEntityManager()->createQuery($dql);
$d2_paginator = new Paginator($query);
$d2_paginator_iter = $d2_paginator->getIterator(); // returns \ArrayIterator object
$adapter = new \Zend_Paginator_Adapter_Iterator($d2_paginator_iter);
$zend_paginator = new \Zend_Paginator($adapter);
$zend_paginator->setItemCountPerPage($perPage)
->setCurrentPageNumber($current_page);
$this->view->paginator = $zend_paginator;
}
然后像平常一样在视图脚本中使用分页器。
Zend_Paginator的构造函数可以采用Zend_Paginator_Adapter_Interface,它是Zend_Paginator_Adpater_Iterator实现的。现在,Zend_Paginator_Adapter_Iterator的构造函数采用了一个\Iterator接口。这个\Iterator还必须实现\Countable (通过查看Zend_Paginator_Adapter_Iterator的构造函数可以看到)。由于Paginator::getIterator()方法返回一个\ArrayIterator,根据定义它符合要求(因为\ArrayIterator实现了\Iterator和\Countable)。
请参阅从 Doctrine 1 到 Doctrine 的“Zend 框架:初学者指南”代码从 Doctrine 1 到 Docrine 2 的移植: https ://github.com/kkruecke/zf-beginners-doctrine2 。它包括使用Zend_Paginator_Adapter_Iterator和 Doctrine 2' Doctrine\ORM\Tools\Pagination\Paginator与Zend_Paginator进行分页的代码。