0

私は (Symfony2 で) 小さなフォーラムのようなアプリケーションを書いていますが、次の問題に直面しています:

私は2つのエンティティを持っています:

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への変換の試行が成功しませんでした)。

4

1 に答える 1

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句のサブクエリに注意してください。これは機能しますが、欠点があります。タイムスタンプフィールドを使用して結合します(追加のネストされたサブクエリを防ぐために、DQLで常に解析エラーが発生します)。これは、特定のスレッドに対しても一意ではない可能性があります。

于 2012-11-06T09:06:47.140 に答える