2011-04-11 44 views
25

我有一個學說查詢,返回博客文章和自己的意見:限制使用fetch-joined集合的原則查詢?

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c 

我想限制的結果,10篇博客文章。

如果查詢包含取回連 收集指定結果限制 方法是:根據DQL文件,setMaxResults()不能正常上取聯接集合(在這種情況下,評論)查詢工作不會像你想要的那樣工作。設置最大結果限制但是,在中取指令 - 加入收藏 一個根實體可能 出現在很多行,有效 保溼超過指定 的結果數以下的情況下 號碼數據庫結果行, 。

我該如何正確限制包含fetch-joined集合的教義查詢(在這種情況下,將結果限制爲10篇博文)?

回答

25

Paginate與教條2.2合併而且新的symfony2版本2.0.10兼容。

現在使用它像

//use Doctrine paginator 
use Doctrine\ORM\Tools\Pagination\Paginator; 

寫您的查詢然後調用類似的結果。

$query->setMaxResults($limit); 
$query->setFirstResult($offset); 
$results = new Paginator($query, $fetchJoin = true); 

希望這會幫助你。

注意:如果您使用的是SF2 2.0.10,則應更新deps和deps.lock文件併爲Doctrine包指定2.2版本。

-1

與查詢生成器一樣,它工作。也許別的什麼是問題?

$qb->add('select', 'b, c, ch, g') 
    ->add('from', 'Broadcast b') 
    ->add('groupBy', 'b.title') 
    ->add('where', 'b.imageBig != \'\'') 
    ->add('orderBy', 'b.starttime ASC') 
    ->setMaxResults(10) 
    ->leftJoin('b.category', 'c') 
    ->leftJoin('b.channel', 'ch') 
    ->leftJoin('b.genre', 'g') 
+0

謝謝,我會用查詢生成器嘗試它。也許這只是使用DQL的一個問題。 – 2011-04-12 15:15:01

+2

這對於訪存連接的集合不起作用。基督徒只取得加入To-One的聯誼會。 – beberlei 2011-04-13 15:59:23

3

此存儲庫http://github.com/beberlei/DoctrineExtensions有一個paginator擴展,可與提取連接一起使用。你必須基本上做出3條SELECT語句,這些擴展名都是爲你做的。

+0

謝謝。你是否介意在沒有DoctrineExtensions的情況下如何做到這一點?現在,我不想包含任何不是絕對需要的額外庫。我也認爲這將會使其他讀者在未來受益。 – 2011-04-12 16:55:09

+0

你應該看看擴展的代碼。它的: 第一:一個SELECT DISTINCT mainentity.id WHERE子句獲取所有的ID。第二:一個選擇子句與以前獲取的ID在ID IN(..)中。第三:總結果數量有一個SELECT DISTINCT子句。 – beberlei 2011-04-13 16:06:06

+0

謝謝,我明白現在發生了什麼。儘管如此,我最終還是使用了擴展。看起來像很多有用的擴展,很少有開銷。 – 2011-04-13 17:22:27

-1

即使這是一箇舊的這在谷歌尋找教條左連接限制高分。很快,它讓我尋找「教條分頁器」,並堅持谷歌後,這是我正在尋找(不是教條分頁)我仍然遇到一些麻煩,找出如何使用它。

可能搜索錯誤,但無法真正找到paginator對象上的良好文檔。無論如何;得到我使用getIterator的結果,並且工作正常。

我的代碼包含rss鏈接和來自rss提要的文章的來源。所以在這個例子中,我會得到一個來源和所有的文章。這段代碼來自Symfony。

 // get the articles (latest first) from source 743 
     $q=$this->getDoctrine()->getManager() 
      ->createQuery('select s, a from MyCompanyRssBundle:Source s 
      join s.Articles a 
      where s.id = :id 
      order by a.id desc') 
      ->setParameter('id',743); 
     $q->setMaxResults(1); // this limits Articles to be only 1 
           // when using $q->getResult(); 
     $sources=new Paginator($q, $fetchJoin = true); 
     $sources=$sources->getIterator(); 
     var_dump($sources[0]->getArticles()); 
+1

@adridev源設置爲Paginator,然後被創建的paginator-> getIterator丟棄(第二次重寫的源被註釋掉)。感謝您的意見,但如果您對如何更好地完成此任務有任何建議,請隨時編輯此答案。我有一段時間沒有使用教義,所以我甚至不知道這個答案是關於什麼的。 – HMR 2017-01-12 07:10:11

+0

對不起,我沒有看到評論。我的錯。 – adridev 2017-01-12 14:02:59