既然我已经阅读了所有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条件。
使用相同的方法在DQL中存档它是否可行 - > where() 避免写下整个条件的符号?
谢谢:)
答案 0 :(得分:5)
不确定最近这次更改是如何进行的,但是对于像我这样的人在问到这个问题之后很久就找到了这个问题,查询构建器现在有办法完成嵌套的AND / OR逻辑:andX()
/ orX()
functions
答案 1 :(得分: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