学说DQL的QueryBuilder剔除其中的实体关系存在(Doctrine DQL QueryBu

2019-09-17 07:11发布

我有两个的entites

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的状态行,但仍包括在结果集中的顺序(因为状态行,所述代码=不等于6的1个匹配的条件)。 我需要能够说“排除从我的结果集具有类似的关联{}东西任何实体”。 是否有一个DQL关键字,可以帮助我在这里?

-Cross张贴学说的用户群,如果我找到一个解决方案将更新的答案在这两个地方。

Answer 1:

我制定了一个办法做到这一点,最终使用子查询, 这感觉有点哈克 ,但我想不出任何其他方式(如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()
    )
);


文章来源: Doctrine DQL QueryBuilder Excluding Entities where relationship exists