Laravel Yajra Datatables无法通过GET/POST请求参数执行查询过滤问题
问题原因
- Datatables 异步请求未携带筛选参数:提交表单仅会刷新当前页面,URL 上携带的参数是页面请求的参数,而 Yajra Datatables 自身发起的 Ajax 数据请求不会自动携带表单中的筛选字段,因此控制器处理 Datatables 请求时无法获取到
vendor_list、category_list等参数,过滤条件不会触发。 - 参数名不匹配:表单中分类下拉框的
name属性为category_list,但控制器中判断的参数名为category_name,二者不一致,就算参数传递成功分类过滤也不会生效。 - (可选优化项)你当前先执行
get()获取全量数据再传入 Datatables 的逻辑,在数据量较大时会出现性能问题,建议直接把查询构造器对象传入 Datatables,由组件自身处理分页、排序逻辑。
解决方法
- 修正控制器参数名错误
将控制器中分类过滤的判断参数修改为和表单一致的category_list:
// 原错误代码 // if($request->has('category_name')){ // 修正后代码 if($request->has('category_list')){ $data = $data->where('category', $request->category_list); }
- 配置 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: [ // 你原有列配置... ] });
- 绑定搜索按钮事件,点击后刷新表格数据
给表单的搜索按钮绑定点击事件,阻止默认的表单提交刷新页面行为,改为重新加载 Datatables 数据:
$('#search-btnn').on('click', function(e) { e.preventDefault(); $('#your-table-id').DataTable().ajax.reload(); });
- (可选性能优化)调整控制器查询逻辑,避免全量查询
将控制器中先执行get()的逻辑改为直接传入查询构造器,Datatables 会自动处理分页、排序等操作,大幅提升大数据量下的性能:
// 原代码 // $data = $data->get(); // return Datatables::of($data) // 修改为 return Datatables::of($data)
内容的提问来源于stack exchange,提问作者Rishabh
相关产品推荐
相关产品推荐

