学说2和zend paginator

Sin*_*hti 6 php pagination zend-framework zend-paginator doctrine-orm

我想在zend_paginator中使用doctrine

这里有一些示例查询:

$ allArticleObj = $ this - > _ em-> getRepository('Articles'); $ qb = $ this - > _ em-> createQueryBuilder();

    $qb->add('select', 'a')
            ->add('from', 'Articles a')
            ->setFirstResult(0)
            ->setMaxResults(5);
Run Code Online (Sandbox Code Playgroud)

是否有任何示例代码显示我们可以为doctrine 2查询构建器编写zend_paginator适配器?

Kur*_*erg 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     
}
Run Code Online (Sandbox Code Playgroud)

然后你就像普通人一样在视图脚本中使用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\PaginatorZend_Paginator进行分页的代码.

代码在这里(虽然它可能不适用于最新的DoctrineORM 2.2),但该示例是有效的:https://github.com/kkruecke/zf-beginners-doctrine2/tree/master/ch7

  • 这种实施是不正确的.即使它有点工作,当你运行$ d2_paginator-> getIterator()时,它从数据库中检索所有实体,然后Zend paginator只是过滤掉它.因此,如果您有很多需要分页的记录,这种方法将非常缓慢. (6认同)

Dav*_*aub 1

当然,结果是您必须实现Zend_Paginator_Adapter_Interface,这本质上意味着实现两个方法:

count()

getItems($offset, $perPage)

您的适配器将接受 Doctrine 查询作为构造函数参数。

原则上,这getItems()部分实际上很简单。只需将$offset$perPage限制添加到查询中(就像您在示例中所做的那样)并执行查询。

实际上,这count()件事往往很棘手。我将遵循 的示例Zend_Paginator_Adapter_DbSelectZend_Db用其Doctrine类似物替换操作。