【问题标题】:Zend_Paginator / Doctrine 2Zend_Paginator / 教义 2
【发布时间】:2011-03-02 15:23:49
【问题描述】:
我将 Doctrine 2 与我的 Zend Framework 应用程序一起使用,一个典型的查询结果可能会产生一百万(或更多)个搜索结果。
我想根据这个结果集使用 Zend_Paginator。但是,我不想将所有结果作为数组返回并使用数组适配器,因为这会效率低下,而是我想为分页器提供总行数和基于限制/偏移量的结果数组.
这是否可以使用数组适配器或者我需要创建自己的分页适配器?
【问题讨论】:
标签:
php
zend-framework
doctrine-orm
zend-paginator
【解决方案1】:
您必须扩展自己的适配器。 Array 适配器以您不希望的方式工作 - 它接收一个数组并根据当前设置返回其中的一部分。您需要的是一个新的适配器,它将采用 DQL statemenet 并设置限制/偏移量。
【解决方案3】:
您不需要实现 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 到 Doctrine 2 的移植:https://github.com/kkruecke/zf-beginners-doctrine2。它包括使用 Zend_Paginator_Adapter_Iterator 和 Doctrine 2' Doctrine\ORM\Tools\Pagination\Paginator 的 Zend_Paginator 分页代码。