我有两个变量,可以用一个值填充,所有'全部'或者是' null'
变量1为$type
,变量2为$brand
。
因此,如果用户选择了我想要相应查询汽车的类型和品牌。如果用户没有选择任何内容,那么该值为' null'如果用户选择全部'然后价值是全部'明显。
我已经在注释代码中写了4个场景,如下所示:
//brand and type -> get cars of brand and type
//brand = all or null and type = all or null -> get all cars
//brand and type = all or null -> get cars of all types and brand
//brand = all or null and type -> get cars of all brands and type
这是我的if结构:
if ($brand && $type) {
$cars = Cars::where([
['cost', '<=', $budget],
['brand', '=', $brand],
['type', '=', $type]
])->get();
} elseif($brand == 'all' || $brand === null && $type == 'all' || $type === null) {
$cars = Cars::where('cost', '<=', $budget)
->get();
} elseif($brand && $type == 'all' || $type === null) {
$cars = Cars::where([
['cost', '<=', $budget],
['brand', '=', $brand],
])->get();
} elseif ($brand == 'all' || $brand === null && $type) {
$cars = Cars::where([
['cost', '<=', $budget],
['type', '=', $type]
])->get();
}
现在,当我检查$brand
的值时,Audi
和$type
的{{1}}为null
。
有人可以向我解释为什么我得到第一个elseif的结果? 所以我的代码认为情况就是这样:
elseif($brand == 'all' || $brand === null && $type == 'all' || $type === null) {
这很奇怪,因为$brand
并非全部&#39;或者&#39; null&#39;因为它是奥迪&#39;
希望它清楚。
答案 0 :(得分:3)
根据operators precedence
table,您的第一个elseif
条件
$brand == 'all' || $brand === null && $type == 'all' || $type === null
被视为:
($brand == 'all') || ($brand === null && $type == 'all') || ($type === null)
值$brand = Audi
和$type = null
确实如此:
(false || false || true) -> true
这就是为什么你需要放括号,以便php可以理解你的逻辑而不是自己应用它。
答案 1 :(得分:1)
你真的让你的生活更加艰难。你有两个影响两个独立条件的独立变量,没有理由你应该在同一条件中混合它们。
$wheres = [ ['cost', '<=', $budget] ];
if ($brand !== "all" && $brand !== null) {
$wheres[] = [ "brand", "=", $brand ];
}
if ($type !== "all" && $type !== null) {
$wheres[] = [ "type", "=", $type ];
}
$cars = Cars::where($wheres);
答案 2 :(得分:-1)
因为我能理解你写条件的方式是非常错误的!
&#39;空&#39;与虚假或&#39;不相同。&#39; null&#39;是一个对象。
因此,您可以像以下一样使用它:
$ brand&amp;&amp; $类型
if(!empty($brand) && !empty($type))