Doctrine2简单where子句问题

时间:2013-03-15 15:25:18

标签: doctrine-orm doctrine

简短而简单:我们会不时向某些用户发送礼物。我有一个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可以实现吗?

1 个答案:

答案 0 :(得分: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
    )

QueryBuilder API中,如下所示:

$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();

此外,除非您拥有动态DQL,否则我个人认为QueryBuilder不适用于此用例。正如您所看到的,查询变得非常复杂,在某些时候您甚至会回到QueryBuilder#getDQL,这会构建DQL字符串并使$qb2的回收变得不可能。 普通DQL在这里工作得很好。