Laravel 8项目中如何为Datatables请求添加自定义筛选条件
解决方案
你当前的问题来自两个核心原因:一是初始化时仅一次性拼接筛选参数到URL,后续筛选值变化或Datatables重绘时参数不会同步更新;二是服务端没有接收、处理这两个自定义筛选参数,所以没有拼到SQL查询中。你可以按以下两步修改:
1. 前端代码修改
不要将筛选参数硬拼到初始化URL中,改用Datatables提供的fnServerParams钩子动态注入最新的筛选参数,同时绑定筛选控件的变化事件触发表格重绘:
@section('footerscripts') <script src="{!!admin_assets!!}/plugins/custom/datatables/datatables.bundle.js"></script> <script> var oTable= null $(document).ready(function () { initEducations() // 新增:筛选值变化时触发表格重绘 $("#filter_education_category_id, #filter_document_type").change(function(){ oTable.api().ajax.reload(); }); function initEducations() { // 这里不需要提前获取筛选值,删除原有URL拼接逻辑 oTable = $('#tzdatatables').dataTable({ "language": { "emptyTable": "No educations found" }, "bServerSide": true, "sAjaxSource": 'educations_filter', // 只保留基础接口地址 // 新增:动态注入筛选参数 "fnServerParams": function (aoData) { aoData.push( { "name": "filter_education_category_id", "value": $("#filter_education_category_id").val() }, { "name": "filter_document_type", "value": $("#filter_document_type").val() } ); }, "bProcessing": true, "aoColumns": [{ "mData": 0 // Sr No }, { "sWidth": "30%", "mData": 1 // Name }, { "mData": 2 // Status label }, { "mData": 3 // Education category }, { "mData": 4 // $created_at_formatted }, // 剩余原有配置保持不变 ... ] }); } }) </script> @endsection
2. 后端Laravel代码修改
在处理Datatables请求的控制器方法中,接收自定义筛选参数并拼接查询条件:
public function educationsFilter(Request $request) { // 基础查询 $query = \App\Models\Education::query(); // 处理Datatables自带的搜索条件(你原有逻辑保留即可,此处仅作示例) if ($search = $request->get('search')['value'] ?? '') { $query->where('title', 'like', "%{$search}%"); } // 新增:处理自定义分类筛选条件 $categoryId = $request->get('filter_education_category_id'); if ($categoryId && $categoryId > 0) { $query->where('category_id', $categoryId); } // 新增:处理自定义文档类型筛选条件 $documentType = $request->get('filter_document_type'); if ($documentType && $documentType > 0) { $query->where('document_type', $documentType); } // 剩余分页、排序、返回逻辑保持你原有写法即可 ... }
修改完成后选中分类筛选值时,就会自动将分类条件拼接到SQL中,符合你预期的效果。
内容的提问来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

