我正在尝试为现有数据库设置一个简单的论坛查看器。主要是作为学习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 %}
。
我该如何完成这项工作?