如何使用 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 【问题描述】:

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

Bird 有一个字段name。如何选择所有 Cages 里面没有名称为 eagleBird

我试图这样做:

$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 选择没有具有特定值的一对多实体的所有行的主要内容,如果未能解决你的问题,请参考以下文章

DQL选择具有一列MAX值的每一行

JQ:查找具有特定属性值的对象的数组索引

如何在 Doctrine ORM 中使用 createQueryBuilder 选择特定列?

具有特定属性名称和值的 Scrapy .css 选择元素

SQL 选择具有特定值的不同 ID

jQuery - 从选择器中排除具有特定值的输入