2012-06-09 14 views
5

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?

+0

Kodunuzu geliştirdiniz mi? Modellerinizde ne tür bir iş mantığınız olduğunu bilmeden bunu cevaplamak zordur. –

+0

ArrayCollection hariç -> add() dışındaki varlıklarda iş mantığı yok. Dinlenme düz belirleyiciler ve alıcılar. –

+0

OneToMany katılırken setMaxResults a Sorun değil mi? –

cevap

5

Bunu, Doktrini sayfalandırma için bir Zend sayfalandırma adaptörünü oluşturarak çözdüm;

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

Çözdüğünüz asıl sorun neydi? –

+1

Ağırlığı yavaş yürütme, yalnızca $ itemPerPageentities sayfalandırma için yükleniyor –

+0

Hayır, özellikle 'Zend_Paginator' özel uygulamanızın yaptığınız şey, sadece Zct_Paginate' –