2012-10-29 43 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中产生解析错误),即使对于给定的线程,这可能也不是唯一的。