如何使用 Doctrine select 所有不具有具有特定值的一对多实体的行
How to select all rows that don't have one-to-many entity with certain value using Doctrine
我有两个实体:Cage
和 Bird
。 Cage
里面有 Birds
所以他们的关系是一对多的。
Bird
有一个字段 name
。我怎么能 select 全部 Cages
里面没有名称为 eagle
的 Bird
。
我正在尝试这样做:
$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)
我有两个实体:Cage
和 Bird
。 Cage
里面有 Birds
所以他们的关系是一对多的。
Bird
有一个字段 name
。我怎么能 select 全部 Cages
里面没有名称为 eagle
的 Bird
。
我正在尝试这样做:
$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)