如何在Laravel Livewire搜索功能中添加学年学期多筛选条件
实现步骤
1. 前端添加下拉筛选表单
在现有搜索栏的提交表单内新增两个下拉选择框,name属性对应学年sy和学期sem即可:
<!-- 插入到现有搜索表单内部 --> <select name="sy" id="schoolyear"> <option value="">全部学年</option> <option value="2023-2024" {{ request('sy') == '2023-2024' ? 'selected' : '' }}>2023-2024学年</option> <option value="2024-2025" {{ request('sy') == '2024-2025' ? 'selected' : '' }}>2024-2025学年</option> <!-- 按需补充更多学年选项 --> </select> <select name="sem" id="semester"> <option value="">全部学期</option> <option value="1" {{ request('sem') == 1 ? 'selected' : '' }}>第一学期</option> <option value="2" {{ request('sem') == 2 ? 'selected' : '' }}>第二学期</option> </select>
2. 后端查询逻辑调整
原有代码直接拼接orWhere会导致后续新增的筛选条件逻辑失效,需要把模糊搜索条件封装到闭包内,再叠加学年、学期的条件筛选,修正后代码如下:
// 先获取请求参数 $sy = request('sy'); $sem = request('sem'); $src = '%' . $src . '%'; // 给模糊搜索关键词加通配符,避免like变成精确匹配 $allschedule = DB::table('load_schedule') ->leftjoin('emp_info', 'load_schedule.faculty_id', '=', 'emp_info.user_id') // 学年筛选:有传值才生效 ->when($sy, function ($query) use ($sy) { return $query->where('load_schedule.sy', $sy); }) // 学期筛选:有传值才生效 ->when($sem, function ($query) use ($sem) { return $query->where('load_schedule.sem', $sem); }) // 所有模糊搜索条件包在闭包内,避免和上层筛选逻辑冲突 ->where(function ($query) use ($src) { $query->where('section', 'like', $src) ->orWhere('room', 'like', $src) ->orWhere('lastname', 'like', $src) ->orWhere('firstname', 'like', $src); }) ->orderBy('lastname', 'ASC') ->select('load_schedule.*', 'emp_info.firstname', 'emp_info.lastname') ->paginate(10); // 分页保留筛选参数,避免翻页时筛选条件失效 $allschedule->appends(['sy' => $sy, 'sem' => $sem, 'src' => request('src')]);
注意事项
- 提前确认
load_schedule表中存在sy、sem字段,字段名和存储值类型要和实际业务一致 - 如果不需要保留全部学年/全部学期的选项,给下拉框加默认值即可
内容的提问来源于stack exchange,提问作者itsme joe
相关产品推荐
相关产品推荐

