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

Laravel Yajra Datatables无法通过GET/POST请求参数执行查询过滤问题

问题原因
  • Datatables 异步请求未携带筛选参数:提交表单仅会刷新当前页面,URL 上携带的参数是页面请求的参数,而 Yajra Datatables 自身发起的 Ajax 数据请求不会自动携带表单中的筛选字段,因此控制器处理 Datatables 请求时无法获取到vendor_list、category_list等参数,过滤条件不会触发。
  • 参数名不匹配:表单中分类下拉框的name属性为category_list,但控制器中判断的参数名为category_name,二者不一致,就算参数传递成功分类过滤也不会生效。
  • (可选优化项)你当前先执行get()获取全量数据再传入 Datatables 的逻辑,在数据量较大时会出现性能问题,建议直接把查询构造器对象传入 Datatables,由组件自身处理分页、排序逻辑。
解决方法
  1. 修正控制器参数名错误
    将控制器中分类过滤的判断参数修改为和表单一致的category_list:
// 原错误代码
// if($request->has('category_name')){
// 修正后代码
if($request->has('category_list')){
    $data = $data->where('category', $request->category_list);
}
  1. 配置 Datatables 初始化参数,携带表单筛选值
    修改你视图中 Datatables 的 JS 初始化代码,通过ajax.data配置项把表单筛选参数加入异步请求中:
// 请将以下代码中的#your-table-id替换为你实际的表格ID
$('#your-table-id').DataTable({
    processing: true,
    serverSide: true,
    // 原ajax配置替换为以下格式
    ajax: {
        url: "{{ route('product.list') }}", // 此处替换为你实际的产品列表接口路由
        data: function (d) {
            // 追加表单筛选参数到请求中
            d.vendor_list = $('#vendor_list').val();
            d.category_list = $('#category_list').val();
        }
    },
    // 其余列、按钮等原有配置保持不变
    columns: [
        // 你原有列配置...
    ]
});
  1. 绑定搜索按钮事件,点击后刷新表格数据
    给表单的搜索按钮绑定点击事件,阻止默认的表单提交刷新页面行为,改为重新加载 Datatables 数据:
$('#search-btnn').on('click', function(e) {
    e.preventDefault();
    $('#your-table-id').DataTable().ajax.reload();
});
  1. (可选性能优化)调整控制器查询逻辑,避免全量查询
    将控制器中先执行get()的逻辑改为直接传入查询构造器,Datatables 会自动处理分页、排序等操作,大幅提升大数据量下的性能:
// 原代码
// $data = $data->get();
// return Datatables::of($data)
// 修改为
return Datatables::of($data)

内容的提问来源于stack exchange,提问作者Rishabh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:27:01