2010-02-21 43 views
4

现在我已经阅读了所有的DQL文档,我仍然有一些疑惑,我 试图在我的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为空 或其他条件完成后,我想使 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和 增加了几个圆括号来分组LIKE条件。

是否可以在DQL中使用相同的存档来存档 - > where() 表示法避免写下整个条件?

谢谢:)

回答

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)') 

这是一种让人毛骨悚然。

下面是修改学说另一种解决方案是能够定制包围:http://danielfamily.com/techblog/?p=37

+0

链接被破坏,这不是问题的实际解决方案。你可能想要更新它。 – pid 2015-07-14 08:31:03

5

不知道这变化是怎么最近做了,但对于像我这样的人来对这个问题寻找答案,这一问题被问多久,查询生成器现在可以实现嵌套的AND/OR逻辑:andX()/orX() functions

+0

太棒了!谢谢。 – 2015-03-25 10:56:45

+0

这应该是被接受的答案。最近,SO正在遭受过时的回答。从长远来看,它将比最新更为陈旧。 – pid 2015-07-14 08:32:55

+0

我同意,这完全应该是被接受的答案。 – 2015-12-15 08:53:51