我有一个带复选框的表单,我想创建一个类似的查询:
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;
答案 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;
如果有人知道更好的方法来实现这一点,请告诉我。 谢谢!