Laravel Datatables结合switch实现多条件独立过滤查询求助
问题根源
原有代码使用多层互斥的else if判断,仅预设了4种过滤参数的组合场景,只有完全匹配这些组合才会触发筛选,自然无法支持单个参数独立筛选的需求,同时重复编写了大量重复的where条件,维护性极差。另外原有代码中的if($student)属于冗余判断,Student::select("*")永远会返回查询构造器,不会为假。
优化解决方案
使用Laravel Eloquent内置的when()条件查询方法即可完美解决问题,它会在第一个参数为真时自动执行后续的闭包查询逻辑,不需要手动编写大量if判断,每个过滤器的判断逻辑互相独立,互不影响。
完整实现代码如下:
public function 你的方法名(Request $request) { $today = date("Y-m-d"); // 先按status分支初始化查询构造器,加每个分支必填的通用条件 switch ($request->stat) { case 'Y': $query = Student::query() ->where('vaccine_date', '<=', $today) ->where('vaccine2_date', '<=', $today); break; case 'D1': $query = Student::query(); break; default: abort(404, 'no record'); } // 每个过滤器独立判断是否生效,支持任意组合/单个筛选 $query->when($request->kampus != "-", function ($q) use ($request) { return $q->where('kodkampus', $request->kampus); }) ->when($request->fakulti != "-", function ($q) use ($request) { return $q->where('kodfakulti', $request->fakulti); }) ->when($request->program != "-", function ($q) use ($request) { return $q->where('kodprogram', $request->program); }) ->when($request->semester != "-", function ($q) use ($request) { return $q->where('part', $request->semester); }); // 直接传入查询构造器给datatables即可,无需提前get(),性能更好 return datatables()->of($query)->make(true); }
代码说明
- 每个status分支对应的必填通用条件(比如Y分支的疫苗日期限制)提前写到查询初始化逻辑,不需要重复编写多次
- 所有过滤器独立判断,只要当前参数不是
-就自动添加对应的筛选条件,不管其他参数是否选中,完美支持单个过滤器筛选、任意组合过滤器筛选的需求 - 不需要提前执行
get()获取集合,直接把查询构造器传给datatables,它会自动处理分页、排序等逻辑,数据量较大时性能远高于提前查询全量集合
内容的提问来源于stack exchange,提问作者jazz
相关产品推荐
相关产品推荐

