You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:06:03