有时你可能想要子句只适用于某个情况为真时才执行查询。例如,如果给定的输入值出现在传入请求中时,你可能想要判断它能达成某个 where 语句,你可以使用 when 方法来完成此操作:
$users = DB::table('users')
->when($role, function ($query) use ($role) {
return $query->where('role_id', $role);
})
->get();
只有当 when 方法的第一个参数为 true 时,闭包里的 where 语句才会执行。如果第一个参数是 false,这个闭包将不会被执行。
你可以将另一个闭包当作第三个参数传递给 when 方法。如果第一个参数的值为 false 时,这个闭包将执行。为了说明如何使用此功能,我们将使用它配置查询的默认排序:
$sortBy = null;
$users = DB::table('users')
->when($sortBy, function ($query) use ($sortBy) {
return$query->orderBy($sortBy);
}, function ($query) {
return$query->orderBy('name');
})
->get();
嗯...看的我是恍然大悟~
于是嘛,一通改。最后如下:
if($opts['timeOrder']){
$optsOrder = true;
$optsDefault = false;
}else{
$optsOrder = false;
$optsDefault = true;
}
$lists = DB::table('orders_eva')->where($where)->when($optsOrder,function ($query) use ($opts) {
switch ($opts['timeOrder']){
case 1:
return$query->orderBy('indate','asc');
break;
case 2:
return$query->orderBy('indate','desc');
break;
case 3:
return$query->orderBy('reply_time','desc');
break;
case 4:
return$query->orderBy('reply_time','desc');
break;
}
})->when($optsDefault,function ($query) use ($opts){
return$query->orderBy('id','desc');
})->get();