PHP Laravel 5 elseif表现不如预期

时间:2017-11-16 10:17:47

标签: php laravel if-statement laravel-5

我有两个变量,可以用一个值填充,所有'全部'或者是' 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;

希望它清楚。

3 个答案:

答案 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))