问题背景:
后台写到一个列表页面,需要传递条件进行排序列表,如图
但这个条件也可以选择不传递。因此后台就需要判断是否传递了这个排序请求,进行对应的数据查询
牛刀小试
首先还是简单一想,那就直接后台判断是否接收到参数嘛。
$opts = Request::input('searchOptions');
DB::table('table_name')->where(function ($query) use ($opts) {
if($opts['timeOrder']){
switch ($opts['timeOrder']){
case 1:
$query->orderBy('indate','asc');
break;
case 2:
$query->orderBy('indate','desc');
break;
case 3:
$query->orderBy('reply_time','desc');
break;
case 4:
$query->orderBy('reply_time','desc');
break;
}
}else{
$query->orderBy('id','desc');
}
})->get();
然鹅,当我改变条件时,并不生效。数据依然是默认排序(id正序)。于是,开始翻文档。不得不说,文档是个好(cang)东(tai)西(shen)。
条件语句#
有时你可能想要子句只适用于某个情况为真时才执行查询。例如,如果给定的输入值出现在传入请求中时,你可能想要判断它能达成某个
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();
好了生效了。填坑小日记。如有错误,还望指正。谢谢~