Laravel中多条件IF始终执行首个分支的原因排查
问题根源:赋值运算符 vs 比较运算符的误用
兄弟,你这问题其实是个新手常踩的经典坑——把赋值运算符=当成了比较运算符==(更严谨的话推荐用===严格相等)!
咱们直接看你代码里的条件判断部分:
if ($filtry_1value[$key] = 'min_cena' OR $filtry_1value[$key] = 'min_uzitna_plocha') {
这里的=是赋值操作,它会把'min_cena'硬塞给$filtry_1value[$key],而赋值表达式的结果就是'min_cena'——在布尔判断里,非空字符串会被判定为true。所以不管原来的数组元素是什么,这个条件永远为真,自然每次都会执行第一个分支的逻辑。
修正方案
把所有条件里的=改成比较运算符==(或者===,避免类型转换带来的意外):
$filtry_1value = ['stat', 'lokalita', 'patro', 'min_cena', 'max_cena', 'min_uzitna_plocha', 'max_uzitna_plocha']; foreach ($filtry_1value as $key => $filtr_1value) { $filtr_1value = \Request::has($filtr_1value)? \Request::get($filtr_1value) : null; if(!empty($filtr_1value)){ // 把赋值=改成比较==(推荐用===严格相等) if ($filtry_1value[$key] === 'min_cena' || $filtry_1value[$key] === 'min_uzitna_plocha') { $query->where(substr($filtry_1value[$key],4), '>=', $filtr_1value); } elseif ($filtry_1value[$key] === 'max_cena' || $filtry_1value[$key] === 'max_uzitna_plocha') { $query->where(substr($filtry_1value[$key],4), '<=', $filtr_1value); } else { $query->where($filtry_1value[$key], '=', $filtr_1value); } } }
额外优化建议
为了让代码更清爽,你可以用in_array简化条件判断,还能去掉没必要的数组下标操作:
$filtry_1value = ['stat', 'lokalita', 'patro', 'min_cena', 'max_cena', 'min_uzitna_plocha', 'max_uzitna_plocha']; foreach ($filtry_1value as $paramName) { $paramValue = \Request::has($paramName) ? \Request::get($paramName) : null; if(!empty($paramValue)){ if (in_array($paramName, ['min_cena', 'min_uzitna_plocha'])) { $column = substr($paramName, 4); $query->where($column, '>=', $paramValue); } elseif (in_array($paramName, ['max_cena', 'max_uzitna_plocha'])) { $column = substr($paramName, 4); $query->where($column, '<=', $paramValue); } else { $query->where($paramName, '=', $paramValue); } } }
这样代码可读性更高,也减少了下标操作可能带来的潜在问题。
内容的提问来源于stack exchange,提问作者paklic9
相关产品推荐
相关产品推荐

