Laravel Yajra Datatables报错:Call to a member function getQuery() on array
解决Laravel Yajra Datatables报错:Call to a member function getQuery() on array
嘿,我刚帮不少Laravel新手解决过这个Yajra Datatables的问题,你的报错Call to a member function getQuery() on array其实很常见,本质是你传给Datatables的不是Eloquent查询构建器实例,而是一个普通数组——Yajra需要查询构建器来处理分页、排序这些Datatables的核心功能,直接传数组就会触发这个错误。
结合你说的AJAX传level_id和level到控制器的场景,我给你一步步拆解解决方法:
1. 检查控制器代码(最可能的问题根源)
你大概率是在控制器里提前把查询结果转成数组了,比如用了->get()或者->toArray(),然后直接传给Datatables::of()。
- ❌ 错误写法(会返回数组,触发报错):
$students = Student::where('level_id', $request->level_id)->get(); return Datatables::of($students)->make(true);
- ✅ 正确写法(传查询构建器,不要调用
get()):
$students = Student::where('level_id', $request->level_id); return Datatables::of($students)->make(true);
解释:Datatables::of()需要的是一个Eloquent查询构建器实例,它会自己处理执行查询、分页、排序这些操作;你提前用get()把结果转成数组,它就没法调用getQuery()方法了。
2. 如果需要自定义处理数据(别直接转数组)
如果必须要给结果加自定义字段或者修改数据,别直接转数组,用Yajra提供的addColumn()或editColumn()方法在链式调用里处理:
return Datatables::of($students) ->addColumn('full_name', function($student) { return $student->first_name . ' ' . $student->last_name; }) ->editColumn('created_at', function($student) { return $student->created_at->format('Y-m-d'); }) ->make(true);
3. 补全并验证你的AJAX代码
你的AJAX代码看起来有点不完整,我帮你补全成标准的Datatables初始化写法,确保参数正确传递:
var level_id = '{{ @$level->id }}'; var level = '{{ @$_level }}'; function view_students() { if ($('#viewStudent-div').is(':visible')) { // 初始化Datatables表格 $('#student-table').DataTable({ processing: true, serverSide: true, ajax: { url: '{{ route("students.view") }}', // 替换成你的实际路由 data: function(d) { // 把参数传给控制器 d.level_id = level_id; d.level = level; } }, columns: [ { data: 'id', name: 'id' }, { data: 'name', name: 'name' }, { data: 'email', name: 'email' }, // 根据你的数据表字段添加其他列 ] }); } }
4. 确认Yajra包的基础配置
如果你是刚装的Yajra,确保Laravel配置正确:
- Laravel 5.5+会自动发现包,老版本需要手动在
config/app.php里注册:
// 服务提供者 Yajra\DataTables\DataTablesServiceProvider::class, // 门面(可选,方便调用) 'DataTables' => Yajra\DataTables\Facades\DataTables::class,
总的来说,这个错误的核心就是「传给Datatables的不是查询构建器而是数组」,只要把控制器里的查询语句改成不执行get()的状态,让Yajra自己处理查询,就能解决问题啦。
内容的提问来源于stack exchange,提问作者Novice
相关产品推荐
相关产品推荐

