【问题标题】: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 并设置限制/偏移量。

    【讨论】:

      【解决方案2】:
      【解决方案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\PaginatorZend_Paginator 分页代码。

      【讨论】:

        猜你喜欢
        • 2012-01-17
        • 2012-07-20
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 2015-09-25
        相关资源
        最近更新 更多