3

私は2つのエンティティを持っています

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

Status
  manyToOne:
    order:
      targetEntity: \Order
      inversedBy: status
  fields:
    code:
      type:integer

ご覧のとおり、1 つの注文が一度に複数のステータスを持つことができます (「発送済み」、「支払い済み」などのステータス)。

ステータスが 6 でない注文をすべて取得するクエリを作成したいと考えています。

3 つの注文があるとします。すべての注文のステータスは「1」(新規) で、これらの注文の 1 つはさらにステータスが「6」(審査中) です。ステータスが 6 でない 2 つの注文のみを取得したいと考えています。

そのようにクエリを書く..

$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 ユーザーグループへの相互投稿と、解決策が見つかれば両方の場所で回答を更新します。

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 に答える