6

我想将教义与 zend_paginator 一起使用

这里有一些示例查询:

$allArticleObj = $this->_em->getRepository('Articles'); $qb = $this->_em->createQueryBuilder();

    $qb->add('select', 'a')
            ->add('from', 'Articles a')
            ->setFirstResult(0)
            ->setMaxResults(5);

是否有任何示例代码显示我们可以为教义 2 查询构建器编写一个 zend_paginator 适配器?

4

4 回答 4

8

你不需要实现Zend_Paginator_Adapter_InterfaceZend_Paginator_Adapter_Iterator已经实现了它。

您可以简单地将 Doctrines 的Paginator传递给Zend_Paginator_Adapter_Iterator,然后将其传递给Zend_Paginator。然后调用Zend_Paginator::setItemCountPerPage($perPage)Zend_Paginator::setCurrentPageNumber($current_page)。像这样:

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; //Then in your view, use it just like your currently use     
}
 

然后像平常一样在视图脚本中使用分页器。

解释:

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进行分页的代码。

代码在这里(尽管它可能不适用于最新的 DoctrineORM 2.2)但示例是有效的:https ://github.com/kkruecke/zf-beginners-doctrine2/tree/master/ch7

于 2012-02-17T19:16:36.670 回答
2

我很惊讶找到一个不会导致 Doctrine 2 和 ZF1 的大型集合出现性能问题的适配器示例是多么困难。

我的灵魂确实使用了来自Doctrine\ORM\Tools\Pagination\PaginatorDoctrine 2.2的内容,就像@Kurt 的回答一样;但是,这将返回教义分页器(它是自己的\Iterator)的不同之处在于,getItems没有对整个查询结果进行水合。

use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
use Doctrine\ORM\Query;

class DoctrinePaginatorAdapter implements \Zend_Paginator_Adapter_Interface
{
    protected $query;

    public function __construct(Query $query)
    {
        $this->query = $query;
    }

    public function count()
    {
        return $this->createDoctrinePaginator($this->query)->count();
    }

    public function getItems($offset, $itemCountPerPage)
    {
        $this->query->setFirstResult($offset)
                    ->setMaxResults($itemCountPerPage);

        return $this->createDoctrinePaginator($this->query);
    }

    protected function createDoctrinePaginator(Query $query, $isFetchJoinQuery = true)
    {
        return new DoctrinePaginator($query, $isFetchJoinQuery);
    }

} 
于 2015-06-15T10:57:43.497 回答
1

当然,结果是您必须实现Zend_Paginator_Adapter_Interface,这实质上意味着实现两种方法:

count()

getItems($offset, $perPage)

您的适配器将接受 Doctrine 查询作为构造函数参数。

原则上,这getItems()部分实际上很简单。只需将$offsetand$perPage限制添加到查询中 - 正如您在示例中所做的那样 - 并执行查询。

在实践中,count()往往是棘手的业务。我会按照 的例子,用它们的类似物Zend_Paginator_Adapter_DbSelect替换Zend_Db操作。Doctrine

于 2011-07-10T05:14:01.410 回答
1

请更换

use Doctrine\ORM\Tools\Pagination as Paginator;

use Doctrine\ORM\Tools\Pagination\Paginator as Paginator;
于 2012-02-29T08:54:44.817 回答