2014-10-16 55 views
3

在symfony 2應用程序中,我有兩個實體通過oneToMany關係(用戶和集合點)映射。 我試圖搜索到我的用戶實體並加入了最後集合點找到的每個用戶。 的想法是這樣的事情:如何使用Doctrine(DQL)限制左連接的結果

$qb = $this->createQueryBuilder('p'); 

    $qb->select('p.id, p.last_name, p.first_name') 
     ->leftJoin('p.rendezvous', 'i') 
      ->select('i.date') 
      ->where('i.user = p.user') 
      ->orderBy('i.date', 'DESC') 
      ->setFirstResult(0) 
      ->setMaxResults(1)     
     ->where('p.user IN ('.$users.')') 
     ->orderBy('p.last_name', 'ASC') 
     ->addOrderBy('p.first_name', 'ASC'); 

我應該有類似的結果:

1,本,Tooch,2014年10月15日十八時45分00秒
7,約翰·斯諾2014 -10-16 17:15:00
...

我試着使用paginator函數但沒有任何成功。
非常感謝您的幫助。

回答

4

當我添加更多的列來獲得,我不得不找到另一種方式來做到這一點。我終於得到了一個可用的DQL查詢:

$qb->select('p.id, p.last_name, p.first_name, r.date, r.othercolumn') 
    ->leftJoin('p.rendezvous', 'r', 'WITH', 'p.id = r.user AND r.date = (SELECT MAX(r2.date) FROM \App\YourBundle\Entity\Rendezvous as r2 WHERE r2.user = p.id)')    
    ->where('p.user IN ('.$users.')') 
    ->orderBy('p.last_name', 'ASC') 
    ->addOrderBy('p.first_name', 'ASC') 
    ->groupBy('p.id'); 
+0

嗨,這是行不通的:嵌入式SELECT將只檢索一次最大日期,並忽略所有不在此日期的其他rendez-vous,即使對於其餘行。換句話說,對於整個請求,嵌入式SELECT只執行一次 – Ninj 2016-05-24 22:21:05

+0

是的,我們希望每行只有最後一個集合日期。問題在於使用 - > setFirstResult(0) - > setMaxResults(1),但由於在此情況下不支持LIMIT的原則錯誤,因此無法在左連接查詢中使用 – ArGh 2016-05-27 10:43:44

0

您是否嘗試過輸出生成的SQL並運行它?

我不確定你是否可以在這樣的左連接中使用maxresults和firstResult,但如果你的想法只是恢復用戶和他們最後的集合點,你可以使用max(i.date)和group by p .id,p.last_name,p.first_name。

但是,如果您想分頁,只需加入兩張表並按i.date排序即可。

希望它能幫助!

+0

使用max(i.date)和groupBy完成了這項工作。謝謝 ! – ArGh 2014-10-20 20:47:23