2012-10-29 77 views
0

我寫一個小論壇一樣的應用程序(在Symfony2中)最大的實體,我遇到了以下問題:學說2.2得到協會

我有兩個實體:

class ForumThread { 
    public $fourmThreadId; 
    public $title; 
    public $posts; // aggregation field -> ArrayCollection of ForumPost (can't be empty) 
} 

class ForumPost { 
    public $content; 
    public $timeCreated; 
    public $thread; // aggregation field -> ForumThread (can't be null) 
} 

我現在想要獲得所有論壇主題,包括每個主題的最新帖子。我想使用它的論壇概述:

------------------------------------- 
| Thread    | Last Post | 
------------------------------------- 
| Name of Thread #1  | ### | 
| Name of Thread #2  | ### | 
| ...     | ... | 
------------------------------------- 

我想獲取完整的ForumPost實體,而不是單個字段(如時間戳)。

此外它應該是高性能的:理想情況下在1-2個查詢中(我使用INNER JOIN發現了原始SQL中的某些內容,但我希望在DQL中或理想情況下使用QueryBuilder - 並且我的翻譯嘗試從SQL到DQL沒有成功)。

回答

0

好吧,我發現了一個解決方案,它的作品,但沒有是最好的方式:

$where = "fp.timeCreated = (SELECT MAX(fpi.timeCreated) FROM ApfelboxGuildBundle:ForumPost fpi WHERE fpi.thread = ft)"; 

$query = $this->getRepository()->createQueryBuilder("ft") 
     ->select("ft, fp") 
     ->join("ft.posts", "fp") 
     ->groupBy("ft.forumThreadId") 
     ->addOrderBy("ft.isSticky", "desc") 
     ->addOrderBy("fp.timeCreated", "desc") 
     ->addOrderBy("ft.forumThreadId", "desc") 
     ->setFirstResult($offset) 
     ->setMaxResults(self::THREADS_PER_PAGE); 

通知的WHERE子句中的子查詢。這有效,但有一個缺陷:它使用時間戳字段進行連接(以防止額外的嵌套子查詢 - 它始終在DQL中產生解析錯誤),即使對於給定的線程,這可能也不是唯一的。