5

特定の 1 対多の関係のメンバー数でソートされた Doctrine データベースからオブジェクトを取得するためのクエリを作成しようとしています。

より具体的には、次の 2 つのエンティティがあります。Person と Federation です。人は 1 つのフェデレーションのメンバーになることができ (人は「フェデレーション」関係を持っています)、フェデレーションはn人を持つことができます (「人」関係としてのフェデレーション)。

フェデレーションのメンバーである人数順に並べられたフェデレーションのリストを返す DQL クエリを作成したいと思います。これらの行に沿ったもの:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people]

それが第一歩でしょう。追加の 2 番目のステップがありますが、1 つのクエリで達成できるかどうかはわかりません。これは、カウントの前にリレーションのメンバーをフィルター処理することになります。そのようです:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)]

その 2 番目は最適な結果ですが、2 番目のケースが単一のクエリで実行可能でない場合、最初のケースは私のニーズを満たします。

前もって感謝します。

4

2 に答える 2

8

次の行に沿って何かを行うことができます。

public function getFederationsOrderedByNumberOfPeople()
{
    return $this->createQueryBuilder('f')
        ->addSelect('COUNT(p) AS HIDDEN personCount');
        ->leftJoin('f.people', 'p');
        ->groupBy('f')
        ->orderBy('personCount', 'DESC');
}

HIDDEN キーワードは Doctrine 2.2 で追加されました。これは、選択したフィールドが結果に含まれないことを意味します。この場合、配列の代わりにエンティティを取得するだけです。

DQL SELECT ドキュメントへの参照: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

于 2014-07-17T08:47:14.390 に答える
6

使用できる DQL には 5 つの集計関数があります (Doctrine 2.2): AVGCOUNTMINMAXおよびSUM

次のクエリが機能するはずです。

SELECT f
FROM AcmeStatsBundle:Federation f
LEFT JOIN f.people p
GROUP BY f.id
ORDER BY COUNT(p)
WHERE p.attr = :some_value

DQL のトリックの詳細については、Doctrine の公式ドキュメントを参照することをお勧めします。

于 2012-09-29T09:33:06.107 に答える