Zend_Paginator / Doctrine 2

时间:2011-03-02 15:23:49

标签: php zend-framework doctrine-orm zend-paginator

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

答案 2 :(得分:0)

您不需要实现 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: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 分页的代码。