如何使用Yajra Laravel Datatables实现指定单列精准搜索
问题原因
你开启了DataTable的服务端渲染模式(serverSide: true),且角色列是你通过addColumn自定义生成的字段,Yajra DataTable默认无法识别自定义字段的搜索逻辑,会自动将角色列的搜索关键词转为全局搜索条件,匹配所有标记为searchable: true的列(包括隐藏的姓名、邮箱等字段),就会出现无关结果。
解决方案
步骤1:调整后端控制器代码
手动添加角色列的搜索过滤逻辑,指定搜索关键词仅匹配角色表的name字段:
public function listUsersData(Request $request) { if(!$request->ajax()) return Redirect::route('/'); $users = User::with('roles'); return DataTables::of($users) ->addColumn('full_name', '{!!$first_name!!} {!!$middle_name!!} {!!$last_name!!}') ->addColumn('roles', function($users){ return $users->getRoleNames()->first(); }) // 新增角色列搜索逻辑 ->filterColumn('roles', function($query, $keyword) { $query->whereHas('roles', function($q) use ($keyword) { // 模糊匹配用like,精确匹配直接写where('name', $keyword) $q->where('name', 'like', "%{$keyword}%"); }); }) ->make(true); }
步骤2:优化前端搜索逻辑(可选,按需开启)
如果需要角色搜索为精确匹配,避免部分匹配到其他角色,修改下拉触发搜索的代码,关闭正则和智能搜索:
$("#users-list-role").on("change", function () { var usersRoleSelect = $("#users-list-role").val(); // 第二参数false=关闭正则匹配,第三参数false=关闭智能模糊搜索 usersTable.columns(1).search(usersRoleSelect, false, false).draw(); });
步骤3:关闭不必要列的搜索权限(可选)
如果不需要隐藏的姓名字段参与任何搜索,直接修改DataTable初始化配置,将这些列的searchable设为false:
columns: [ {data: 'full_name', name: 'full_name'}, {data: 'roles', name: 'roles.name'}, {data: 'email', name: 'email'}, {data: 'first_name', name: 'first_name', searchable: false, visible: false }, {data: 'middle_name', name: 'middle_name', searchable: false, visible: false }, {data: 'last_name', name: 'last_name', searchable: false, visible: false }, ],
内容的提问来源于stack exchange,提问作者m33ts4k0z
相关产品推荐
相关产品推荐

