2012-04-06 58 views
3

我想知道如何對從Doctrine 2中的實體關聯映射獲得的結果進行分頁?例如原則2關聯映射分頁

class Customer { 
    /** 
    * @OneToMany(targetEntity="Order") 
    */ 
    private $orders; 
} 

可以用作例如:

$customer->getOrders(); 

將返回Order對象的集合。

問題是存在大量訂單對象時。

構建自定義查詢時,我們可以使用Doctrine\ORM\Tools\Pagination\Paginator,但是在使用關聯映射時,我沒有看到任何方法掛鉤到查詢生成。

class Paginator { 
    /** 
    * @param Query|QueryBuilder $query A Doctrine ORM query or query builder. 
    */ 
    function __construct(
    //.... 
+0

我在這裏有完全一樣的情況,但沒有願望,我剛剛添加的方法來我的實體倉庫,給了分頁程序友好DQL查詢自定義分頁程序類的工作。 – Brock 2013-04-30 12:41:36

回答

4

如果使用EXTRA_LAZY獲取模式,則在保溼集合時,Doctrine不會檢索所有對象。它只會檢索在集合上使用slice()方法時所需的子集。

class Customer { 
    /** 
    * @OneToMany(targetEntity="Order", fetch="EXTRA_LAZY") 
    */ 
    private $orders; 
} 

$cust = new Customer; 
$orders = $cust->getOrders()->slice(100, 50); 

您需要驗證它如何與分頁進行交互。

+0

謝謝Louis-Philippe。我不知道*額外的懶惰聯想,並認爲他們可能是一條好路。 Query和QueryBuilder對象的外框是分頁的,所以我可能不得不考慮編寫一個自定義的適配器。 – dianovich 2012-04-06 22:30:55

0

集合具有過濾API,允許從集合中切片部分數據。如果尚未從數據庫加載集合,則過濾API可以在SQL級別上工作,以優化對大集合的訪問。 Doctrine Filtering Collections

class Customer { 
    /** 
    * @OneToMany(targetEntity="Order") 
    */ 
    private $orders; 

    public function getOrders($offset = 0, $limit = 30){ 

    $criteria = Criteria::create() 
       ->setFirstResult($offset) 
       ->setMaxResults($limit); 

    return $this->orders->matching($criteria); 

    } 

} 

$cust = new Customer; 
$orders = $cust->getOrders(50, 100);