Laravel yajra datatable 过滤后未加载新数据仍返回原有数据问题
Laravel Yajra DataTable 过滤后仍加载原有数据解决方案
问题根因
触发表格重绘时未将表单的family_id过滤参数传递给后端接口,服务端接收不到过滤条件,因此始终返回全量数据。
修复步骤
1. 前端Blade代码调整
修改DataTable的ajax配置,新增动态传参逻辑,每次请求时自动携带表单过滤参数:
var table = $('#tickets-list').DataTable({ processing: true, serverSide: true, ajax: { url: "{{ route('admin.timetable.index') }}", data: function (params) { // 追加表单的family_id参数,选择器替换为你实际表单中对应字段的选择器 params.family_id = $('[name="family_id"]').val(); } }, columns: [ {data: 'student_id'}, {data: 'day'}, {data: 'subject'}, {data: 'time'}, {data: 'action', name: 'action', orderable: false, searchable: false}, ] }); // 表单提交逻辑保持不变即可 $('#family_form').on('submit', function(e) { e.preventDefault(); table.draw(); });
2. 后端控制器优化(推荐)
原有逻辑先查询全量数据再做集合过滤,数据量较大时性能损耗高,建议调整为查询阶段直接过滤:
if ($request->ajax()) { $timetableQuery = TimeTable::query(); // 提前过滤数据,无需查询全量后再筛选 if ($request->filled('family_id')) { $timetableQuery->where('family_id', 'like', "%{$request->get('family_id')}%"); } return Datatables::of($timetableQuery->get()) ->addIndexColumn() ->rawColumns(['action', 'id']) ->make(true); } return view('auth.timetable.index', compact('timetables'));
原有集合过滤兼容方案(如不修改查询逻辑)
如果坚持使用原有集合过滤逻辑,需确保TimeTable模型返回的集合中包含family_id字段,否则过滤规则会判定所有行不符合条件,可在过滤逻辑前加日志验证参数接收情况。
内容的提问来源于stack exchange,提问作者Hadayat Niazi
相关产品推荐
相关产品推荐

