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?
Haben Sie Ihren Code profiliert? Es ist schwer zu beantworten, ohne zu wissen, welche Art von Geschäftslogik Sie in Ihren Modellen haben. –
Keine Geschäftslogik in Entitäten außer -> add() für ArrayCollection. Rest ist Plain Setter und Getter. –
Ist setMaxResults nicht ein Problem bei der Verwendung von OneToMany Joins? –