简短而简单:我们会不时向某些用户发送礼物。我有一个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可以实现吗?
答案 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在这里工作得很好。