如何使用 Doctrine select 所有不具有具有特定值的一对多实体的行

How to select all rows that don't have one-to-many entity with certain value using Doctrine

我有两个实体:CageBirdCage 里面有 Birds 所以他们的关系是一对多的。

Bird 有一个字段 name。我怎么能 select 全部 Cages 里面没有名称为 eagleBird

我正在尝试这样做:

$cages = $this->createQueryBuilder("c")
            ->leftJoin("c.birds", "b")
            ->where("b.name != :name")
            ->setParameter("name", 'eagle')
            ->getQuery()->getResult();

如果 Cage 中只有一个 Bird (eagle),此方法有效。然后 Cage 不是 selected 这是正确的行为。

但是如果有多个 Birds,其中之一是 eagle,即使 eagle 在里面,Cage 也会被 selected。

这是想法,根据需要调整 table 和列名称:

SELECT * FROM cages
WHERE cage_id NOT IN
(SELECT cage_id FROM birds WHERE name='eagle');

所以,使用学说:

$qb = $this->createQueryBuilder();

$cagesWithEagles = $qb->select('b.cage_id')
    ->from('birds', 'b')
    ->where("b.name = :name")
    ->setParameter("name", 'eagle')
    ->getQuery()
    ->getResult();

$cagesWithoutEagles = $qb->select('c.cage_id')
    ->from('cages', 'c')
    ->where($qb->expr()->notIn('c.cage_id', $cagesWithEagles))
    ->getQuery()
    ->getResult();

(灵感来自 'where not in' query with doctrine query builder