Doctrine orm 原则2.2从关联中获取最大实体
我正在编写一个类似论坛的小应用程序(Symfony2),遇到以下问题: 我有两个实体:Doctrine orm 原则2.2从关联中获取最大实体,doctrine-orm,subquery,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 $time
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个查询中(我在原始SQL中发现了一些使用内部联接的内容,但我希望在DQL中或理想情况下使用QueryBuilder-我从SQL到DQL的转换尝试没有成功)。好的,我找到了一个解决方案,它可以工作,但不是最好的方法:
$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中总是产生解析错误),即使对于给定的线程,它也可能不是唯一的