如何使用Doctrine选择不具有特定值的一对多实体的所有行

时间:2015-06-14 22:58:41

标签: php mysql orm doctrine-orm doctrine

我有两个实体:CageBirdCage内有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 CageCage,则此方法有效。然后未选择Birds,这是正确的行为。

但如果有多个eagle且其中一个Cage,即使eagle在内,{{1}}也会被选中。

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();

(灵感来自'where not in' query with doctrine query builder