доктрина 2 и zend paginator

Я хочу использовать доктрину с zend_paginator

здесь пример запроса:

$ allArticleObj = $ this -> _ em-> getRepository («Статьи»); $ qb = $ this -> _ em-> createQueryBuilder ();

$qb->add('select', 'a') ->add('from', 'Articles a') ->setFirstResult(0) ->setMaxResults(5); 

есть ли какой-нибудь примерный код, чтобы показать, что мы можем написать адаптер zend_paginator для построителя запросов doctrine 2?

Вывод, конечно же, заключается в том, что вам нужно реализовать Zend_Paginator_Adapter_Interface , что по сути означает реализацию двух методов:

count()

getItems($offset, $perPage)

Ваш адаптер будет принимать запрос Doctrine как аргумент конструктора.

В принципе, часть getItems() фактически проста. Просто добавьте ограничения $offset и $perPage к запросу – как вы делаете в своем примере – и выполните запрос.

На практике бизнес count() имеет тенденцию быть сложным. Я бы выполнил пример Zend_Paginator_Adapter_DbSelect , заменив операции Zend_Db их аналогами Doctrine .

Вам не нужно реализовывать Zend_Paginator_Adapter_Interface . Он уже реализован Zend_Paginator_Adapter_Iterator .

Вы можете просто передать доктрины « 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 ).

См. Этот порт от Доктрины 1 до Docrine 2 кода «Zend Framework: Руководство для начинающих» от Доктрины 1 до Доктрины: https://github.com/kkruecke/zf-beginners-doctrine2 . Он включает в себя код для разбивки на страницы с Zend_Paginator с помощью Zend_Paginator_Adapter_Iterator с Doctrine 2 ' Doctrine \ ORM \ Tools \ Pagination \ Paginator .

Код здесь (хотя он может не работать с последним Doctrineorm 2.2), но пример действителен: https://github.com/kkruecke/zf-beginners-doctrine2/tree/master/ch7

Я был очень удивлен, как трудно найти пример адаптера, который не вызывает проблем с производительностью с большими коллекциями для Doctrine 2 и ZF1.

Моя душа действительно использует Doctrine\ORM\Tools\Pagination\Paginator из Doctrine 2.2, как и ответ Курта; тем не менее, разница в том, что это вернет указ о доктрине (который является самоидентификатором) из 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); } } 

Пожалуйста измените

 use Doctrine\ORM\Tools\Pagination as Paginator; 

в

 use Doctrine\ORM\Tools\Pagination\Paginator as Paginator;