Laravel 5.5 里面的when用法:

// \DB::enableQueryLog();
$data = StudentClassHour::where('student_info_id', $student_info_id)
->where('status', 1)
->when($type == 1, function ($query) {
$query->whereIn('hour_type', [1, 2, 3, 4, 5]);
})
->when($type == 2, function ($query) {
$query->whereIn('hour_type', [6, 7, 8]);
})
->get();
// dd(\DB::getQueryLog());

源代码路径:
D:\phpStudy\WWW\BCCKidV1.0\vendor\laravel\framework\src\Illuminate\Database\Concerns\BuildsQueries.php

public function when($value, $callback, $default = null)
{
if ($value) {
return $callback($this, $value) ?: $this;
} elseif ($default) {
return $default($this, $value) ?: $this;
}

return $this;
}

不难看出,when会判断第一个参数的真与假,如果是真,则执行第一个callback,如果是假,则执行默认的方法,我的那段代码就只设置了真的时候需要执行的代码,因为条件有三种,不只有两种。这样的话可以使代码易读性更好,当然也可以拆分子句,但是when这个用法相对更赞。
另外,在集合collection中,也有这个方法,用法一样的。源文件位置:
D:\phpStudy\WWW\BCCKidV1.0\vendor\laravel\framework\src\Illuminate\Support\Collection.php

laravel 5.5 支持的 operators :

D:\phpStudy\WWW\xxx\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php

public $operators = [
'=', '<', '>', '<=', '>=', '<>', '!=', '<=>',
'like', 'like binary', 'not like', 'ilike',
'&', '|', '^', '<<', '>>',
'rlike', 'regexp', 'not regexp',
'~', '~*', '!~', '!~*', 'similar to',
'not similar to', 'not ilike', '~~*', '!~~*',
];