2012-06-09 6 views
5

Ich habe Probleme mit Doctrine 2 performe bei der Verwendung HYDRATE_OBJECT. Wenn ich von HYDRATE_ARRAY zu HYDRATE_OBJECT umschalte, dauert es fast 10 mal länger! Ich habe doctrine 2 and zend paginator als Referenz verwendet:Lehre 2.2 + Zend Framework Paginierung Geschwindigkeit Optimierung

$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 

Was sollte ich beachten? Wie kann man die Bearbeitungszeit reduzieren und trotzdem HYDRATE_OBJECT nutzen? Gibt es eine bessere Möglichkeit, Seitenumbruch zu erreichen?

* Edit: Mit ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage); signifikant die Ladezeit verringern, aber bei der Verwendung von $iterator:

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

Zend nur kennt $itemsPerPage, (count($iterator) == $itemsPerPage) und damit die Paginierung Links immer 1 Seite nur berechnen. Wie kann ich eine korrekte Paginierung mit Zend_Paginator erreichen und nur $itemsPerPage Entitäten laden?

+0

Haben Sie Ihren Code profiliert? Es ist schwer zu beantworten, ohne zu wissen, welche Art von Geschäftslogik Sie in Ihren Modellen haben. –

+0

Keine Geschäftslogik in Entitäten außer -> add() für ArrayCollection. Rest ist Plain Setter und Getter. –

+0

Ist setMaxResults nicht ein Problem bei der Verwendung von OneToMany Joins? –

Antwort

5

Ich löste das jetzt, indem ich einen Zend Paginierung Adapter Wrapper für Doctrine Paginierung erstellen;

<?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

Was war das eigentliche Problem, das Sie gelöst haben? –

+1

Erschreckend langsame Ausführung, indem nur $ itemsPerPageentities für die Paginierung geladen wird –

+0

Nein, ich meine speziell, was Ihre benutzerdefinierte Implementierung von 'Zend_Paginator' effizienter macht, als nur die Doctrine-Sammlung an' Zend_Paginate' zu ​​übergeben. –