学说2和zend paginator

时间:2011-07-09 14:01:01

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

我想在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适配器?

4 个答案:

答案 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;