3

我有两个实体

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 关键字吗?

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

4

1 回答 1

3

我找到了一种最终使用子选择的方法,这感觉有点笨拙,但我想不出任何其他方法(其中 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()
    )
);
于 2012-05-17T18:28:45.283 回答