Doctrine 2.2从关联中获取最大实体

时间:2012-10-29 18:13:57

标签: doctrine-orm subquery

我正在编写一个类似论坛的小应用程序(在Symfony2中),我遇到了以下问题:

我有两个实体:

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的翻译尝试没有成功)

1 个答案:

答案 0 :(得分: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子句中的子查询。这有效,但有一个缺陷:它使用timestamp字段连接(以防止额外的嵌套子查询 - 它总是在DQL中产生解析错误),即使对于给定的线程也可能不是唯一的。