如何使用 Doctrine 选择没有具有特定值的一对多实体的所有行
Posted
技术标签:
【中文标题】如何使用 Doctrine 选择没有具有特定值的一对多实体的所有行【英文标题】:How to select all rows that don't have one-to-many entity with certain value using Doctrine 【发布时间】:2015-06-14 22:58:40 【问题描述】:我有两个实体:Cage
和 Bird
。 Cage
内部有Birds
,所以他们的关系是一对多的。
Bird
有一个字段name
。如何选择所有 Cages
里面没有名称为 eagle
的 Bird
。
我试图这样做:
$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
也会被选中。
【问题讨论】:
【参考方案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();
(灵感来自'where not in' query with doctrine query builder)
【讨论】:
好了,原理很清楚了。我使用 foreach 循环和自定义数组在 php 级别上执行此操作。这是更好的方法。谢谢!以上是关于如何使用 Doctrine 选择没有具有特定值的一对多实体的所有行的主要内容,如果未能解决你的问题,请参考以下文章