2012-06-09 12 views
5

Mam problem z wykonaniem Doctrine 2 podczas korzystania z HYDRATE_OBJECT. Po przełączeniu z HYDRATE_ARRAY na HYDRATE_OBJECT, trwa to prawie 10 razy dłużej! Użyłem doctrine 2 and zend paginator jako odniesienie:Doctrine 2.2 + Optymalizacja prędkości stronicowania Zend Framework

$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 

co powinienem zwrócić szczególną uwagę? Jak zmniejszyć czas przetwarzania i nadal korzystać z HYDRATE_OBJECT? Czy istnieje lepszy sposób na wykonanie podziału na strony?

* Edycja: Korzystanie ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage); znacząco zmniejszyć czas ładowania, ale przy użyciu $iterator:

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

Zend tylko wie o $itemsPerPage (count($iterator) == $itemsPerPage), a więc linki stronicowania zawsze obliczyć tylko 1 strona. W jaki sposób można uzyskać prawidłową paginację za pomocą Zend_Paginator, a jedynie ładować jednostki $itemsPerPage?

+0

Czy profilowałeś swój kod? Trudno odpowiedzieć na to pytanie, nie wiedząc, jaką logikę biznesową masz w swoich modelach. –

+0

Brak logiki biznesowej w jednostkach z wyjątkiem -> add() dla ArrayCollection. Odpoczynek jest prostym ustawiaczem i pobierającym. –

+0

Czy ustawienie setMaxResults nie jest problemem podczas łączenia OneToMany? –

Odpowiedz

5

Rozwiązałem to teraz, tworząc paker stronicowania Zend dla paginacji 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

Jaki był faktyczny problem, który rozwiązałeś? –

+1

Strasznie powolne wykonywanie, przez ładowanie tylko $ itemsPerPageents dla paginacji –

+0

Nie, chodzi mi o to, co zrobiła twoja niestandardowa implementacja 'Zend_Paginator', bardziej wydajnie niż tylko przekazywanie kolekcji Doctrine do' Zend_Paginate' –