2012-02-01 37 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);