1

簡潔でシンプル: 時折、一部のユーザーにギフトを送ります。テーブルと、多対多の関係を持つテーブルがuserあります。gift特定のギフトを受け取っていないすべてのユーザーを取得したい。

ただし、次のクエリは、特定のギフトを除外して、すべてのユーザーとユーザーが受け取ったギフトを返します。

$qb = $this->_em->createQueryBuilder();
$qb->select('u, g')
        ->from('Application\Entity\User', 'u')
        ->leftJoin('u.gifts', 'g')
        ->where('g.id != = :giftId')
        ->setParameter('giftId', 2);

ユーザーが特定のギフトを受け取った場合、そのユーザーを結果セットから除外したいと考えています。これはDoctrine2で可能ですか?

4

1 に答える 1

0

最初にすべてのユーザーを選択してから、既にギフトを持っているユーザーを除外する必要があります。

SELECT
    u
FROM
    Application\Entity\User u
WHERE
    u.id NOT IN(
        SELECT
            u2.id
        FROM
            Application\Entity\User u2
        JOIN
            u2.gifts g
        WHERE
            g.id = :giftId
    )

APIでは、次のようになります。QueryBuilder

$qb1 = $em->createQueryBuilder();
$qb2 = $em->createQueryBuilder();

$qb2
    ->select('u2')
    ->from('Application\Entity\User', 'u2')
    ->join('u2.gifts', 'g')
    ->andWhere($qb2->expr()->eq('g.id', ':giftId');

$users = $qb1
    ->select('u')
    ->from('Application\Entity\User', 'u')
    ->andWhere($qb1->expr->in($qb2->getDQL())
    ->setParameter('giftId', $giftId)
    ->getQuery()
    ->getResult();

また、QueryBuilder動的 DQL を使用していない限り、このユース ケースには適していないと個人的には思います。ご覧のとおり、クエリは非常に複雑になり、ある時点で にフォールバックすることさえあります。QueryBuilder#getDQLこれにより、DQL 文字列が構築され、リサイクルが$qb2不可能になります。ここではプレーンな DQL が問題なく機能します。

于 2013-03-16T01:14:07.903 に答える