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
?
Czy profilowałeś swój kod? Trudno odpowiedzieć na to pytanie, nie wiedząc, jaką logikę biznesową masz w swoich modelach. –
Brak logiki biznesowej w jednostkach z wyjątkiem -> add() dla ArrayCollection. Odpoczynek jest prostym ustawiaczem i pobierającym. –
Czy ustawienie setMaxResults nie jest problemem podczas łączenia OneToMany? –