I'm struggling with Doctrine 2 performce when using HYDRATE_OBJECT
. When I switch from HYDRATE_ARRAY
to HYDRATE_OBJECT
, it takes nearly 10 times longer! I've used doctrine 2 and zend paginator as reference:
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 160 ms
vs
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 1.4s
What should I watch out for? How to reduce the processing time and still utilize HYDRATE_OBJECT
? Is there a better way to accomplish pagination?
*Edit: Using ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage);
significantly decrease loading time, but when using $iterator
:
$adapter = new \Zend_Paginator_Adapter_Iterator($iterator);
$zend_paginator = new \Zend_Paginator($adapter);
$zend_paginator->setItemCountPerPage($itemsPerPage)
->setCurrentPageNumber($page);
Zend only knows about $itemsPerPage
, (count($iterator) == $itemsPerPage
) and thus the pagination links always calculate 1 page only. How can I accomplish a proper pagination using Zend_Paginator, and only load $itemsPerPage
entities?
I solved this now by creating a Zend pagination adapter wrapper for Doctrine pagination;
<?php
class PaginatorAdapter extends Doctrine\ORM\Tools\Pagination\Paginator implements
Zend_Paginator_Adapter_Interface
{
public function getItems($offset, $itemCountPerPage)
{
$this->getQuery()->setFirstResult($offset)->setMaxResults($itemCountPerPage);
return $this->getQuery()->getResult($this->getQuery()->getHydrationMode());
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With