HYDRATE_OBJECT
kullanırken Doctrine 2 ile mücadele ediyorum. HYDRATE_ARRAY
'dan HYDRATE_OBJECT
'a geçtiğimde, yaklaşık 10 kat daha uzun sürüyor! Ben referans olarak doctrine 2 and zend paginator kullandım:Doctrine 2.2 + Zend Framework sayfalandırma hızı optimizasyonu
$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
Ne için dikkat etmelidir? İşlem süresi nasıl azaltılabilir ve hala HYDRATE_OBJECT
? Sayfalama işlemini gerçekleştirmek için daha iyi bir yol var mı?
* Düzenleme: anlamlı yükleme süresini azaltmak ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage);
kullanarak, fakat $iterator
kullanırken:
$adapter = new \Zend_Paginator_Adapter_Iterator($iterator);
$zend_paginator = new \Zend_Paginator($adapter);
$zend_paginator->setItemCountPerPage($itemsPerPage)
->setCurrentPageNumber($page);
Zend sadece yaklaşık $itemsPerPage
bilir (count($iterator) == $itemsPerPage
) ve dolayısıyla sayfalandırma bağlantıları her zaman yalnızca 1 sayfa hesaplayın. Zend_Paginator kullanarak düzgün bir sayfalama işlemini nasıl yapabilirim ve yalnızca $itemsPerPage
varlıklarını yükleyebilir miyim?
Kodunuzu geliştirdiniz mi? Modellerinizde ne tür bir iş mantığınız olduğunu bilmeden bunu cevaplamak zordur. –
ArrayCollection hariç -> add() dışındaki varlıklarda iş mantığı yok. Dinlenme düz belirleyiciler ve alıcılar. –
OneToMany katılırken setMaxResults a Sorun değil mi? –