使用for循环在查询中生成嵌套条件

时间:2014-01-29 15:11:55

标签: php zend-framework2 zend-db

我有一个带复选框的表单,我想创建一个类似的查询:

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

嵌套条件取决于用户选择的复选框。

我知道或可以找到有关如何执行嵌套条件的示例的唯一方法如下:

$select->where->nest
    ->equalTo('option', 'check1')
    ->or
    ->equalTo('option', 'check2')
    ->or
    ->equalTo('option', 'check3')
    ->unnest();

但是这只能在巢内部使用静态数量的equalTo,当我的情况有可变数量时。 我想做这样的事情(其中$ filters是用户选择的复选框值数组):

$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;

2 个答案:

答案 0 :(得分:1)

以下是我最终如何做到这一点:

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

答案 1 :(得分:0)

以下是我最终如何做到这一点。看起来有点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;

如果有人知道更好的方法来实现这一点,请告诉我。 谢谢!