2013-02-25 83 views
1

我想在我的查詢中使用限制和偏移量,但返回的記錄數不匹配。當我不使用偏移和限制功能得到26個物體,並設置方法Doctrine2 OFFSET和LIMIT

->setMaxResults(5) 
->setFirstResult(10) 

數爲1 ... 後,這是怎麼回事?

+0

你加入其他表嗎? – 2013-02-25 18:38:42

+0

是'$ Q = $ EM-> createQueryBuilder() \t \t - >選擇( '一個,TT') \t \t - >從( 'MyBackendBundle:廣告', 'A') \t \t - > leftJoin( 'a.transactionType', 'TT') \t \t - > leftJoin( 'a.propertyType', 'PT') \t \t - > leftJoin( 'a.place', 'p') \t \t - > leftJoin ('a.pictures','pic') \t \t - > where('tt.name LIKE:transactionType') \t \t - > andWhere(「pt.name LIKE:propertyType」);' – leebake 2013-02-25 18:45:01

+0

限制行時必須考慮連接 – 2013-02-25 21:56:56

回答

7

你可能是在DQL中獲得fetch-joining時遇到的一個典型問題。這是一個非常簡單的問題,並且源於偏移和限制應用於尚未水合且必須標準化的結果集的事實(請參閱documentation about first and max results about that)。

如果您想避免此問題(即使使用更復雜的聯接或聯接結果),您將需要使用ORM DQL Paginator API。使用分頁程序基本觸發多個查詢:

  1. 根據您的偏移/限額計算的結果集的記錄數
  2. 計算您的查詢的根實體的不同的標識符(應用最大/第一批成果)
  3. 檢索連接結果(不施加第一/最大結果)

它的使用是非常簡單的:

$query = $em->crateQuery($fetchJoinQuery); 

$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query); 

$query->setFirstResult(20); 
$query->setMaxResults(100); 

foreach ($paginator as $result) { 
    var_dump($result->getId()); 
} 

這將從偏移量20開始打印100個項目,而不考慮連接或提取連接結果的數量。

雖然這可能看起來是無法執行的,但它是處理提取連接結果問題的最安全方法,導致結果中出現明顯雜亂的偏移和限制。你可以看看如何直接處理internals of the ORM Paginator

相關問題