2014-01-29 153 views
1

嵌套條件我有一個複選框一種形式,我想創建像查詢:使用for循環生成查詢

SELECT * FROM table WHERE name = 'name' AND (option = 'check1' OR option = 'check2' OR option = 'check3') 

嵌套條件將取決於哪些檢查框選擇的用戶。

我知道還是可以找到關於如何嵌套條件看起來像例子中的唯一方法:

​​

但這隻會用equalTo的巢內的靜態數量,工作時,我的情況下,將有一個可變金額。 我願做這樣的事情(其中$過濾器是複選框值由用戶選擇的陣列):

$select->where->StartNest(); 
foreach($filters['check'] as $check){ 
    $select->where->like('option', '%'.$check.'%'); 
    $select->where->or; 
} 
$select->where->StopNest(); 

是這樣可能什麼?還是有更好的方法來解決這個問題?

非常感謝您關注此問題!

編輯:

這裏是我終於實現了它。似乎有點hacky,但它現在正在做這項工作:

$strLiteral = ''; 
foreach($filters['check'] as $check){ 
    $strLiteral .= "options LIKE '%$check%' OR "; 
} 
$strLiteral = substr($strLiteral, 0, -4); //remove the final ' OR' from string 
$select->where->nest 
    ->literal($strLiteral) 
    ->unnest; 
+0

像'的foreach ... {$選擇 - > orWhere($ expr-> equalTo( 'A', 'B'));} '應該工作不能告訴你確切的語法,但通常應該是要走的路。 – Sam

+0

感謝您的回覆!我的問題是多個或哪些地方需要嵌套。除非我錯過了一些東西,那隻會導致'WHERE name ='name'AND option ='check1'或option ='check2',但是我正在尋找'WHERE name ='name'AND(option =' check1'OR option ='check2')' – Stu

回答

0

這是我最終做到這一點。似乎有點哈克,但它做的工作現在:

$strLiteral = ''; 
foreach($filters['check'] as $check){ 
    $strLiteral .= "options LIKE '%$check%' OR "; 
} 
$strLiteral = substr($strLiteral, 0, -4); //remove the final ' OR' from string 
$select->where->nest 
    ->literal($strLiteral) 
    ->unnest; 

如果有人知道一個更好的方式來做到這一點,讓我知道。 謝謝!

1

這裏是我最後只是:

$p = new Predicate(); 
foreach($filters['check'] as $check) { 
    $p->OR->like('option', '%'.$check.'%'); 
} 
$select->where->addPredicates($p);