[英]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_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 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 \\ Paginator与Zend_Paginator进行分页的代码 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.