[英]How to select all rows that don't have one-to-many entity with certain value using Doctrine
我有两个实体: Cage
和Bird
。 Cage
里面有Birds
,所以他们的关系是一对多的。
Bird
有一个字段name
。 我怎样才能选择里面没有名字叫eagle
的Bird
所有Cages
。
我试图这样做:
$cages = $this->createQueryBuilder("c")
->leftJoin("c.birds", "b")
->where("b.name != :name")
->setParameter("name", 'eagle')
->getQuery()->getResult();
如果Cage
只有单个Bird
( eagle
),则此方法有效。 然后没有选择Cage
,这是正确的行为。
但是如果有多个Birds
并且其中一个是eagle
,则即使eagle
在里面, Cage
也会被选中。
这是想法,根据需要调整表名和列名:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.