繁体   English   中英

Zend_Paginator / Doctrine 2

[英]Zend_Paginator / Doctrine 2

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

我想使用Zend_Paginator与此结果集一致。 但是,我不希望将所有结果作为数组返回并使用数组适配器,因为这样效率很低,而是我想为分页器提供总行数,然后根据限制/偏移量提供结果数组。

这是可行的使用数组适配器还是我需要创建自己的分页适配器?

您必须扩展自己的适配器。 数组适配器以您不想要的方式工作 - 它接收一个数组并根据当前设置返回一部分数组。 您需要的是一个新的适配器,它将采用DQL statemenet并设置限制/偏移量。

您不需要实现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; 
}

然后你就像普通人一样在视图脚本中使用paginator。

说明:

Zend_Paginator的构造函数可以使用Zend_Paginator_Adapter_InterfaceZend_Paginator_Adpater_Iterator实现它。 现在, Zend_Paginator_Adapter_Iterator的构造函数采用\\ Iterator接口。 这个\\ Iterator还必须实现\\ Countable (通过查看Zend_Paginator_Adapter_Iterator的构造函数可以看到)。 由于Paginator :: getIterator()方法返回一个\\ ArrayIterator ,因此根据定义它符合账单(因为\\ ArrayIterator实现了\\ Iterator\\ Countable )。

从Doctrine 1到Doctrine的“Zend Framework:A Beginner's Guide”代码中,参见Doctrine 1到Docrine 2的端口: https//github.com/kkruecke/zf-beginners-doctrine2 它包括使用Zend_Paginator_Adapter_Iterator和Doctrine 2'Desstrine \\ ORM \\ Tools \\ Pagination \\ PaginatorZend_Paginator进行分页的代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM