Doctrine DQL QueryBuilder排除存在关系的实体

时间:2012-05-17 15:40:16

标签: 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

正如您所看到的 - 一个订单一次可以拥有多个状态(“已经发货”,“已经付款等等”等状态。)

我想编写一个查询来获取所有状态均为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的状态行,但仍包括结果集中的顺序(因为code = 1的状态行与不等于6的条件匹配)。我需要能够说“从我的结果集中排除任何具有像{something}这样的关联的实体”。是否有DQL关键字可以帮助我?

- 在学说用户组上发布 - 如果找到解决方案,将在两个地方更新答案。

1 个答案:

答案 0 :(得分:3)

我最终使用了一个子选择感觉有点hacky ,但是我想不出任何其他方式(其中6,7,8,9是状态,我想从我的结果集中排除。)

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