2012-02-01 60 views
52
WHERE a = 1 AND (b = 1 Or b = 2) AND (c = 1 OR c = 2) 

我该如何在教义中做到这一点?如何在教条中使用和在哪里?

$q->where("a = 1"); 
$q->andWhere("b = 1") 
$q->orWhere("b = 2") 
$q->andWhere("c = 1") 
$q->orWhere("d = 2") 

这个心不是正确的......应该是:

$q->where("a = 1"); 
$q->andWhere("b = 1") 
    $q->orWhere("b = 2") 
$q->andWhere("c = 1") 
    $q->orWhere("d = 2") 

,但我怎么能做到吗?在推进功能getNewCriterion,并在学说......?

回答

82
$q->where("a = 1") 
    ->andWhere("b = 1 OR b = 2") 
    ->andWhere("c = 2 OR c = 2") 
    ; 
+6

那么为什么不把它全部放在'where()'调用? – MatBailie 2012-02-01 11:48:32

+3

我不会满意这种语法...如果你尝试迁移到某种病态的“SQL”,其中'OR'将被替换为'||'......如何工作,何时你需要使用'b =? OR b =?' – Vyktor 2012-02-01 11:49:53

+0

@Dems是的,这当然是可以的。这种方法更快,寿。 – Maerlyn 2012-02-01 11:50:11

11

为什么不

$q->where("a = 1"); 
$q->andWhere("b = 1 OR b = 2"); 
$q->andWhere("c = 1 OR d = 2"); 

编辑:您还可以使用Expr class(Doctrine2)。

+0

问题在于教条1.2,你链接的文档是2.0。 – Maerlyn 2012-02-01 13:24:19

+4

@Maerlyn,好吧,这个问题没有'doctrine-1.2'标签,所以我不能确定用户是指哪一个 - 在这种情况下,我隐含地期待最新的标签。 – Czechnology 2012-02-01 14:26:18

+0

我的错误,不知道在doctrine2的查询生成器中有没有和WhereWhere和WhereWhere。 – Maerlyn 2012-02-01 14:32:43

39

这里是为那些谁拥有更复杂的情况,并使用Doctrine 2 *与QueryBuilder一个例子:

$qb->where('o.foo = 1') 
    ->andWhere($qb->expr()->orX(
     $qb->expr()->eq('o.bar', 1), 
     $qb->expr()->eq('o.bar', 2) 
    )) 
    ; 

这些都是在Czechnology答复中提到的表达式。

+1

帮了我。欢呼:) – Sharpy35 2017-11-30 12:54:09

+0

救命啊:)谢谢 – Hooli 2018-02-13 12:56:13

0

一两件事失踪这里:如果你有不同数量的要放在一起,像

WHERE [...] AND (field LIKE '%abc%' OR field LIKE '%def%') 

和不元素的想自己组建一个DQL字符串,可以使用所提到的orX如上所示:

$patterns = ['abc', 'def']; 
$orStatements = $qb->expr()->orX(); 
foreach ($patterns as $pattern) { 
    $orStatements->add(
     $qb->expr()->like('field', $qb->expr()->literal('%' . $pattern . '%')) 
    ); 
} 
$qb->andWhere($orStatements);