web-dev-qa-db-ja.com

Doctrineクエリビルダー(Symfony)でcountDistinctを使用する方法

私は彼と一緒にクエリに対して返されたIDの明確な数を数えようとしています:

$query = $repo->createQueryBuilder('prov')
        ->select('c.id')
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->countDistinct('c.id')
        ->getQuery();

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

Attempted to call method "countDistinct" on class "Doctrine\ORM\QueryBuilder" [...]

私も試しました

$query = $repo->createQueryBuilder('prov')
        ->select('c.id')
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->expr()->countDistinct('c.id')
        ->getQuery();

これはこのエラーにつながります:

Error: Call to a member function getQuery() on a non-object in

ドキュメントとは異なる方法でこれを行う方法について、他の指針を得ることができません。

誰かが解決策を提案できますか? ここにリンクの説明を入力してください

13
matt_jay

countDistinctはExprクラスのメソッドであり、COUNT DISTINCTはSELECTステートメントに含まれている必要があるため、次のようになります。

$qb = $repo->createQueryBuilder('prov');
$query = $qb
        ->select($qb->expr()->countDistinct('c.id'))
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->getQuery();

動作するはずです。または単に:

$query = $repo->createQueryBuilder('prov')
        ->select('COUNT(DISTINCT c.id)')
        ->innerJoin('prov.products', 'prod')
        ->innerJoin('prod.customerItems', 'ci')
        ->innerJoin('ci.customer', 'c')
        ->where('prov.id = :brand')
        ->setParameter('brand', $brand)
        ->getQuery();
26
Kamil Adryjanek

あなたの場合にcountDistinctを使用する適切な方法は次のとおりです。

$qb = $repo->createQueryBuilder('prov');

$query = $qb->
    ->select($qb->expr()->countDistinct('c.id'))
    ->innerJoin('prov.products', 'prod')
    ->innerJoin('prod.customerItems', 'ci')
    ->innerJoin('ci.customer', 'c')
    ->where('prov.id = :brand')
    ->setParameter('brand', $brand)
    ->getQuery();
2
Tomasz Madeyski