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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:27:02