4

すべての DQL ドキュメントを読んだので、まだ疑問があります。DQL でネストされた条件を実行しようとしていますが、DQL をいじっていますが、それらをアーカイブできないようです。

自分自身をより明確にするために:

私はこのDQLクエリを持っています

    $q = Doctrine_Query::create()
        ->select('c.nombre,c.webpage')
        ->addSelect('COUNT(m.marca_id) as total_marcas')
        ->from('Corporativos c')
        ->leftJoin('c.Marcas m')
        ->groupBy('c.corporativo_id')
        ->where('ISNULL(c.deleted_at)')
        ->orwhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch))
        ->orWhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch.'%'))
        ->orWhere('c.nombre LIKE :nombre', array(':nombre'=>$srch.'%'))
        ->orderBy('c.nombre ASC')
        ->limit(0,20);

これにより、次の MySQL クエリが生成されます。

SELECT c.corporativo_id AS c__corporativo_id, c.nombre AS c__nombre,
c.webpage AS c__webpage, COUNT(m.marca_id) AS m__0 FROM corporativos c
LEFT JOIN marcas m ON c.corporativo_id = m.corporativo_id WHERE
(ISNULL(c.deleted_at) OR c.nombre LIKE :nombre OR c.nombre
LIKE :nombre OR c.nombre LIKE :nombre) GROUP BY c.corporativo_id ORDER
BY c.nombre ASC

ただし、deleted_at が null であるか、他の条件が満たされている結果のセットを取得しています。isnull(deleted_at) を必須にしたいと思います。SQL に関して話している場合、クエリは次のようになります。

SELECT c.corporativo_id AS c__corporativo_id, c.nombre AS c__nombre,
c.webpage AS c__webpage, COUNT(m.marca_id) AS m__0 FROM corporativos c
LEFT JOIN marcas m ON c.corporativo_id = m.corporativo_id WHERE
(ISNULL(c.deleted_at) AND (c.nombre LIKE :nombre OR c.nombre
LIKE :nombre OR c.nombre LIKE :nombre)) GROUP BY c.corporativo_id
ORDER BY c.nombre ASC

AND の最初の OR ステートメントを変更し、LIKE 条件をグループ化するためにいくつかの括弧を追加したことがわかります。

条件全体を書き留めることを避けて、同じ ->where() 表記を使用して DQL でこれをアーカイブすることは可能ですか?

ありがとう :)

4

2 に答える 2

5

この変更がどのくらい最近行われたかはわかりませんが、この質問が出されてからずっと後に答えを探してこの質問に来る私のような人にとって、クエリビルダーはネストされた AND/OR ロジックを達成する方法を持っています: andX()/ orX()functions

于 2014-07-17T16:43:49.950 に答える
1

を使用できますがDoctrine_Query::andWhere、これはステートメントを間違った方法で因数分解すると思うので、次のようにクエリを作成できます

->where('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch))
->andWhere('ISNULL(c.deleted_at)')
->orWhere('c.nombre LIKE :nombre', array(':nombre'=>'%'.$srch.'%'))
->andWhere('ISNULL(c.deleted_at)')
->orWhere('c.nombre LIKE :nombre', array(':nombre'=>$srch.'%'))
->andWhere('ISNULL(c.deleted_at)')

これは一種の不気味です。

Doctrine を変更してカスタム ブラケットを作成できる別のソリューションを次に示します: http://danielfamily.com/techblog/?p=37

于 2010-02-25T10:09:02.977 に答える