既存のデータベースに簡単なフォーラム ビューアをセットアップしようとしています。主に Symfony2 の学習の演習として。
ほとんどのフォーラムと同様に、相互に関連するものがあります。ほとんどの場合、次のようなチェーンになります。
Forum -> Thread -> Comment -> Author
Forum > Thread と Thread > Comment の間の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 %}
ます。
どうすればこれを完了できますか?