Orm 原则DQL QueryBuilder排除存在关系的实体

Orm 原则DQL QueryBuilder排除存在关系的实体,orm,symfony,doctrine-orm,associations,outer-join,Orm,Symfony,Doctrine Orm,Associations,Outer Join,我有两个一百分 Order oneToMany: statuses: targetEntity: \Status mappedBy: order Status manyToOne: order: targetEntity: \Order inversedBy: status fields: code: type:integer 如您所见-一个订单一次可以有多个状态(如“已发货”、“已付款”等状

我有两个一百分

Order
  oneToMany:
    statuses:
       targetEntity: \Status
       mappedBy: order

Status
  manyToOne:
    order:
      targetEntity: \Order
      inversedBy: status
  fields:
    code:
      type:integer
如您所见-一个订单一次可以有多个状态(如“已发货”、“已付款”等状态)

我想写一个查询,获取所有状态不为6的订单。 我发现很难理解这件事

假设我有三份订单。所有订单的状态为“1”(新),其中一个订单的状态为“6”(正在审核)。我只想检索状态为6的两个订单

这样编写查询

$qb->select('o')
    ->from('MyOrderBundle:Order', 'o')
    ->innerJoin('o.statuses', 'st')
    ->where(
    $qb->expr()->not(
        $qb->expr()->eq('st.code', 6)
        )
);
从生成的SQL中排除状态行6,但仍包括结果集中的顺序(因为代码=1的状态行与不等于6的条件匹配)。我需要能够说“从我的结果集中排除任何具有类似{something}的关联的实体”。这里有一个DQL关键字可以帮助我吗


-在doctrine用户组上交叉发布,如果我找到解决方案,将在这两个位置更新答案。

我最终找到了一种方法,使用subselect来实现这一点,这感觉有点粗糙,但我想不出任何其他方法(其中6,7,8,9是我想从结果集中排除的状态)


这不起作用,因为
notIn()
需要2个参数,而您只给了它1个。
$qb->select('o')
->from('MyOrderBundle:Order', 'o')
->innerJoin('o.statuses', 'st')
->where(
    $qb->expr()->notIn(
        $qb2->select('DISTINCT(o2.id)')
        ->from('MyOrderBundle:Status', 'stat')
        ->innerJoin('stat.order','o2','WITH', $qb2->expr()->in('stat.code', (6,7,8,9)))->getDQL()
    )
);