2012-06-09 34 views
5

當我使用HYDRATE_OBJECT時,我在使用Doctrine 2表現很掙扎。當我從HYDRATE_ARRAY切換到HYDRATE_OBJECT時,它花費了將近10倍的時間!我用doctrine 2 and zend paginator參考:學說2.2 + Zend框架分頁速度優化

$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 

我應該注意什麼?如何減少處理時間並仍然使用HYDRATE_OBJECT?有沒有更好的方法來完成分頁?

*編輯:使用->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage);顯著減少加載時間,但使用$iterator時:

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

Zend公司只知道$itemsPerPage,(count($iterator) == $itemsPerPage),因此分頁鏈接始終只計算1頁。我如何使用Zend_Paginator完成適當的分頁,並且只加載$itemsPerPage實體?

+0

你是否分析了你的代碼?如果不知道模型中的業務邏輯類型,很難回答這個問題。 –

+0

除了 - > add()ArrayCollection實體沒有業務邏輯。休息是簡單的制定者和獲得者。 –

+0

使用OneToMany連接時,setMaxResults是否存在問題? –

回答

5

我現在通過爲Doctrine分頁創建一個Zend分頁適配器包裝來解決這個問題;

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

你解決了什麼實際問題? –

+1

異常緩慢的執行,只裝$ itemsPerPageentities爲分頁 –

+0

不,我的意思是具體是什麼做的'Zend_Paginator'要做的不僅僅是傳遞學說集合'Zend_Paginate' –