Php Zend_Paginator/学说2

Php Zend_Paginator/学说2,php,zend-framework,doctrine-orm,zend-paginator,Php,Zend Framework,Doctrine Orm,Zend Paginator,我在Zend Framework应用程序中使用了Doctrine 2,一个典型的查询结果可能会产生一百万(或更多)个搜索结果 我想使用Zend_Paginator与这个结果集保持一致。但是,我不希望以数组的形式返回所有结果并使用数组适配器,因为这样会效率低下,相反,我希望向分页器提供总行数以及基于限制/偏移量的结果数组 这是使用阵列适配器可以实现的,还是我需要创建自己的分页适配器?您必须扩展自己的适配器。阵列适配器以您不希望的方式工作-它接收一个阵列并根据当前设置返回其中的一部分。您需要的是一个

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

我想使用Zend_Paginator与这个结果集保持一致。但是,我不希望以数组的形式返回所有结果并使用数组适配器,因为这样会效率低下,相反,我希望向分页器提供总行数以及基于限制/偏移量的结果数组


这是使用阵列适配器可以实现的,还是我需要创建自己的分页适配器?

您必须扩展自己的适配器。阵列适配器以您不希望的方式工作-它接收一个阵列并根据当前设置返回其中的一部分。您需要的是一个新的适配器,它将接受DQL statemenet并设置限制/偏移

这里是您不需要实现Zend\u Paginator\u Adapter\u接口,因为它已经由Zend\u Paginator\u Adapter\u迭代器实现了

相反,只需将条令的分页器传递给Zend_Paginator_Adapter_迭代器,如下所示:

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; 
}
 
然后在视图脚本中使用paginator,就像通常一样

说明: Zend\u Paginator的构造函数可以采用Zend\u Paginator\u Adapter\u接口,该接口由Zend\u Paginator\u Adapter\u迭代器实现。现在,Zend\u Paginator\u Adapter\u迭代器的构造函数接受一个\Iterator接口。这个\Iterator还必须实现\Countable(您可以通过查看Zend\u Paginator\u Adapter\u Iterator的构造函数看到)。由于Paginator::getIterator()方法返回一个\ArrayIterator,根据定义它符合要求(因为\ArrayIterator实现了\Iterator\Countable

请参阅“Zend框架:初学者指南”代码第1条至第2条中的此端口,从第1条至第:。它包括使用Zend_Paginator使用Zend_Paginator_Adapter_迭代器和条令2'条令\ORM\Tools\Pagination\Paginator进行分页的代码