我想在zend_paginator中使用doctrine
这里有一些示例查询:
$ allArticleObj = $这 - > _em-> getRepository( '文章'); $ qb = $ this-> _em-> createQueryBuilder();
$qb->add('select', 'a') ->add('from', 'Articles a') ->setFirstResult(0) ->setMaxResults(5);
是否有任何示例代码显示我们可以为doctrine 2查询构建器编写zend_paginator适配器?
答案 0 :(得分:8)
您无需实施 Zend_Paginator_Adapter_Interface 。它已由 Zend_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
}
然后你就像普通人一样在视图脚本中使用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:https://github.com/kkruecke/zf-beginners-doctrine2的“Zend Framework:A Beginner's Guide”代码中,从Doctrine 1到Docrine 2的这个端口。它包含使用 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
答案 1 :(得分:2)
我很惊讶找到一个适配器示例是多么困难,该示例不会导致Doctrine 2和ZF1的大型集合出现性能问题。
我的灵魂使用the Doctrine\ORM\Tools\Pagination\Paginator
from Doctrine 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);
}
}
答案 2 :(得分:1)
当然,结果是你必须实现Zend_Paginator_Adapter_Interface
,这实际上意味着实现这两种方法:
count()
getItems($offset, $perPage)
您的适配器会接受Doctrine查询作为构造函数参数。
原则上,getItems()
部分实际上很简单。只需将$offset
和$perPage
限制添加到查询中 - 就像您在样本中所做的那样 - 并执行查询。
在实践中,count()
业务往往很棘手。我会按照Zend_Paginator_Adapter_DbSelect
的示例,将Zend_Db
操作替换为Doctrine
类似物。
答案 3 :(得分:1)
请更改
use Doctrine\ORM\Tools\Pagination as Paginator;
到
use Doctrine\ORM\Tools\Pagination\Paginator as Paginator;