web-dev-qa-db-ja.com

symfony2 doctrineクエリビルダーを使用して個別のクエリを選択する方法は?

私のプロジェクトのブログセクションに関連するすべてのカテゴリを取得するsymfonyのコードがあります:

$category = $catrep->createQueryBuilder('cc')
    ->Where('cc.contenttype = :type')
    ->setParameter('type', 'blogarticle')
    ->getQuery();

$categories = $category->getResult();

これは機能しますが、クエリには重複が含まれます。

Test Content
Business
Test Content

クエリでDISTINCTコマンドを使用したい。私が見た唯一の例では、生のSQLを書く必要があります。 Symfony2/Doctrineが提供するQueryBuilder機能をすべて使用するように、すべてのコードを同じにしようとしているので、これを可能な限り回避したいと思います。

次のようにクエリにdistinct()を追加してみました。

$category = $catrep->createQueryBuilder('cc')
    ->Where('cc.contenttype = :type')
    ->setParameter('type', 'blogarticle')
    ->distinct('cc.categoryid')
    ->getQuery();

$categories = $category->getResult();

ただし、次のエラーが発生します。

致命的なエラー:未定義のメソッドDoctrine\ORM\QueryBuilder :: distinct()の呼び出し

Symfonyに個別の選択を指示するにはどうすればよいですか?

69
mickburkejnr

あなたは書くことができます

select DISTINCT f from t;

なので

select f from t group by f;

実は、私は現在自分自身がDoctrineに参加しているだけなので、本当の答えを出すことはできません。ただし、上記のように、 group by を使用して個別をシミュレートし、それを Doctrine に変換できます。さらにフィルタリングを追加する場合は、group byの後にHAVINGを使用します。

30
Raffael

これは動作します:

$category = $catrep->createQueryBuilder('cc')
        ->select('cc.categoryid')
        ->where('cc.contenttype = :type')
        ->setParameter('type', 'blogarticle')
        ->distinct()
        ->getQuery();

$categories = $category->getResult();
161
skler

「select()」ステートメントを使用する場合、これを行うことができます。

$category = $catrep->createQueryBuilder('cc')
    ->select('DISTINCT cc.contenttype')
    ->Where('cc.contenttype = :type')
    ->setParameter('type', 'blogarticle')
    ->getQuery();

$categories = $category->getResult();
51
Chris