2014-01-29 109 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);