2012-06-09 10 views
5

Estoy luchando con Doctrine 2 cuando utilizo HYDRATE_OBJECT. Cuando cambio de HYDRATE_ARRAY a HYDRATE_OBJECT, ¡toma casi 10 veces más! He usado como referencia doctrine 2 and zend paginator:Doctrine 2.2 + Zend Framework optimización de velocidad de paginación

$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 

¿Qué debo tener en cuenta? Cómo reducir el tiempo de procesamiento y aún utilizar HYDRATE_OBJECT? ¿Hay una mejor manera de lograr la paginación?

* Editar: Usando ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage); disminuir significativamente el tiempo de carga, pero cuando se utiliza $iterator:

$adapter = new \Zend_Paginator_Adapter_Iterator($iterator); 
$zend_paginator = new \Zend_Paginator($adapter);   
$zend_paginator->setItemCountPerPage($itemsPerPage) 
    ->setCurrentPageNumber($page); 

Zend sólo conoce $itemsPerPage, (count($iterator) == $itemsPerPage) y por lo tanto los enlaces de paginación siempre calculan solamente 1 página. ¿Cómo puedo lograr una paginación apropiada usando Zend_Paginator, y solo cargo las entidades $itemsPerPage?

+0

¿Ha publicado su código? Es difícil responder a esto sin saber qué tipo de lógica empresarial tiene en sus modelos. –

+0

Sin lógica comercial en entidades excepto -> add() para ArrayCollection. El resto es setters y getters llanos. –

+0

¿No es setMaxResults un problema al usar OneToMany joins? –

Respuesta

5

Resolví esto ahora al crear un envoltorio de adaptador de paginación Zend para la paginación de Doctrine;

<?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()); 
    } 
} 
+0

¿Cuál fue el problema real que resolvió? –

+1

Ejecución terriblemente lenta, solo cargando $ itemsPerPageentities para la paginación –

+0

No, me refiero específicamente a qué hizo su implementación personalizada de 'Zend_Paginator' de forma más eficiente que pasar la colección de Doctrine a' Zend_Paginate' –