3

我将 Doctrine 2 与我的 Zend Framework 应用程序一起使用,典型的查询结果可能会产生一百万(或更多)的搜索结果。

我想根据这个结果集使用 Zend_Paginator。但是,我不想将所有结果作为数组返回并使用数组适配器,因为这会效率低下,而是我想向分页器提供总行数和基于限制/偏移量的结果数组.

使用 Array 适配器是否可行,或者我需要创建自己的分页适配器?

4

3 回答 3

3

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.

于 2011-03-02T16:39:15.100 回答
0

这里是http://framework.zend.com/manual/en/zend.paginator.advanced.html

于 2011-05-21T01:53:24.883 回答
0

您不需要实现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进行分页的代码。

于 2012-02-20T19:40:50.560 回答