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

您可以看到我只是将第一个 OR 语句更改为 AND 并添加了一对括号来对 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 回答