我在 laravel 中使用 yajra 数据表。我已经实现了该表。除了搜索之外,它工作正常。我也有一个自定义过滤器。 下面的代码显示了数据表初始化和ajax请求。用户类型过滤器工作正常。
<script>
$(document).ready(function() {
var table = $('#dataList').DataTable({
processing: true,
serverSide: true,
ajax: {
url: "{{ route('users.user.index') }}",
data: function (d) {
d.user_type = $('#user_type_filter').val();
}
},
columns: [
{data: 'DT_RowIndex', name: 'DT_RowIndex'},
{data: 'name', name: 'name'},
{data: 'email', name: 'email'},
{data: 'phone', name: 'phone'},
{data: 'action', name: 'action', orderable: false, searchable: false},
]
});
$('#search-form').on('submit', function(e) {
table.draw();
e.preventDefault();
});
} );
</script>
后端索引页过滤用户类型
public function index(Request $request)
{
/**
* Ajax call by datatable for listing of the users.
*/
if ($request->ajax()) {
$data = User::with('userType')->get();
$datatable = DataTables::of($data)
->filter(function ($instance) use ($request) {
if ($request->has('user_type') && $request->get('user_type')) {
$instance->collection = $instance->collection->filter(function ($row) use ($request) {
//return Str::contains($row['phone'], $request->get('phone')) ? true : false;
return $row['user_type_id'] == $request->get('user_type');
});
}
if ($request->input('search.value') != "") {
$instance->collection = $instance->collection->filter(function ($row) use ($request) {
return Str::contains($row['name'], $request->input('search.value')) ? true : false;
});
}
})
->addIndexColumn()
->addColumn('action', function ($user) {
return view('users.datatable', compact('user'));
})
->rawColumns(['action'])
->make(true);
return $datatable;
}
$user_type = UserType::pluck('user_type','id')->all();
$users = User::with('userType')->paginate(25);
return view('users.index', compact('users','user_type'));
}
此代码仅在当前页面上生成搜索。
最佳答案
你应该这样尝试
filterColumn('name', function($query, $keyword) {
$sql = "name like ?";
$query->whereRaw($sql, ["%{$keyword}%"]);
})
关于Laravel Datatable 默认搜索不适用于自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65091131/