我有两个实体:Cage
和Bird
。 Cage
内有Birds
因此他们的关系是一对多的。
Bird
有一个字段name
。如何选择里面没有Cages
且名称为Bird
的所有eagle
。
我试图这样做:
$cages = $this->createQueryBuilder("c")
->leftJoin("c.birds", "b")
->where("b.name != :name")
->setParameter("name", 'eagle')
->getQuery()->getResult();
如果Bird
中只有eagle
Cage
个Cage
,则此方法有效。然后未选择Birds
,这是正确的行为。
但如果有多个eagle
且其中一个Cage
,即使eagle
在内,{{1}}也会被选中。
答案 0 :(得分:1)
这是想法,根据需要调整表和列名称:
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();