Symfony2 / Doctrine中实体关系的复杂排序

时间:2012-08-17 15:14:18

标签: symfony doctrine dql

我正在尝试为现有数据库设置一个简单的论坛查看器。主要是作为学习Symfony2的练习。

与大多数论坛一样,它有一些相互关联的东西。主要是在这样的链中:

Forum -> Thread -> Comment -> Author

我使用注释创建了一个模式,该注释描述了Forum>之间的 OneToMany 关系。线程和线程之间>评论。作者是带有线程和评论的 OneToOne

我的问题是我想在论坛中显示一个线程列表,该列表按每个线程中最新评论的时间戳排序(在论坛上是正常的)。事实上,我还需要确保粘性或固定线程位于列表的顶部。

我一直在把代码放在不同的地方,但我不确定最佳实践的地方。我在ForumRepository

中尝试了DQL解决方案
public function findWithOrderedComments($forum_id)
{
    $forum = $this->getEntityManager()
        ->createQuery('SELECT f,
           (SELECT c.time
                FROM xxForumArchiveBundle:Comment c
                WHERE c.post = p.id
                ORDER BY c.time DESC) AS time
            FROM xxForumArchiveBundle:Forum f 
            JOIN f.posts p
            WHERE f.id = :forum_id
            ORDER BY time')
        ->setParameter('forum_id', $forum_id)
        ->getSingleResult();

    return $forum[0];
}

但是这(除了将我的查询响应转换为数组)没有做任何事情。我已经玩弄了在模型中放置一些排序逻辑以返回已排序的评论集合,但是a)不确定这是否是正确的位置而b)在论坛页面上没有解决我的排序顺序。我也想过在树枝模板中做这件事,但这对我来说似乎不对。我也可以在控制器中做到这一点,但鉴于Doctrine已经加载了数据(?)我相当确定这是浪费。

在我的树枝模板中,我基本上正在做{% for post in forum.posts %}

我该如何完成这项工作?

0 个答案:

没有答案