Laravel 12中Yajrabox Datatables在TeacherController的Ajax请求异常问题
Laravel 12 Yajra Datatables Ajax加载异常排查
问题现象
在Laravel 12项目中,尝试在TeacherController的show(Teacher $teacher)方法里通过外键关联,用Ajax加载Yajrabox Datatables时出现Ajax错误,但相同逻辑在AssistanceTeacherController的index()方法中能正常运行。
相关代码
初始TeacherController代码
use App\Models\Teacher; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use DataTables; class TeacherController extends Controller { public function show(Teacher $teacher, Request $request) // 也试过show(Request $request, Teacher $teacher) { if($request->ajax()) { $assistance_teachers = DB::table('assistance_teachers')->query() ->where('teacher_id', $teacher->id) ->orderBy('id', 'desc'); return DataTables::eloquent($assistance_teachers) ->make(true); } return view('teacher.show',['teacher' => $teacher]); } }
对应路由
Route::get('/teacher/{teacher}', [TeacherController::class, 'show'])->name('teacher.show');
拆分方法后的TeacherController代码
即使把方法拆成两个函数,问题依然存在:
public function show(Teacher $teacher) { return view('teacher.show',['teacher' => $teacher]); } public function ajaxshow(Request $request) { if($request->ajax()) { $assistance_teachers = DB::table('assistance_teachers')->query() // 试过去掉外键条件,直接查询:->where('teacher_id', 1) ->orderBy('id', 'desc'); return DataTables::eloquent($assistance_teachers) ->make(true); } }
拆分后的路由
Route::get('/teacherajaxshow/', [TeacherController::class, 'ajaxshow'])->name('teacherajaxshow'); Route::get('/teacher/{teacher}', [TeacherController::class, 'show'])->name('teacher.show');
前端Ajax代码
$('#datat').DataTable({ processing: true, serverSide: true, ajax:"{{ route('teacherajaxshow') }}", // 也试过route('teacher.show',$teacher->id) columns: [ {data:'created_at', name:'created_at'}, {data:'training_module', name:'training_module'}, {data:'period', name:'period'}, {data:'turn', name:'turn'}, {data:'didactic_unit', name:'didactic_unit'}, {data:'checkin_time', name:'checkin_time'}, {data:'departure_time', name:'departure_time'}, {data:'theme', name:'theme'}, {data:'place', name:'place'}, {data:'educational_platforms', name:'educational_platforms'}, {data:'remarks', name:'remarks'}, ] });
正常运行的AssistanceTeacherController代码
use App\Models\AssistanceTeacher; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; use App\Http\Requests\StoreAssistanceTeacherRequest; use App\Http\Requests\UpdateAssistanceTeacherRequest; use DataTables; class AssistanceTeacherController extends Controller { /** * Display a listing of the resource. */ public function index(Request $request) { if($request->ajax()) { $assistance_teachers = AssistanceTeacher::query() ->orderBy('assistance_teachers.id', 'desc'); return DataTables::eloquent($assistance_teachers) ->addColumn('teacher_name',function (AssistanceTeacher $data){ return $data->teacher->name .' '. $data->teacher->lastname; }) ->editColumn('created_at', function(AssistanceTeacher $data) { return date('Y/m/d h:i A', strtotime($data->created_at)); }) ->editColumn('checkin_time', function(AssistanceTeacher $data) { return date('h:i A', strtotime($data->checkin_time)); }) ->editColumn('departure_time', function(AssistanceTeacher $data) { return date('h:i A', strtotime($data->departure_time)); }) ->make(true); } return view('assistance_teacher.index'); } // 路由:Route::get('/teacher', [TeacherController::class, 'index'])->name('teacher'); /* Ajax代码 $('#datat').DataTable({ processing: true, serverSide: true, ajax:"{{ route('assistance_teacher') }}", columns: [ {data:'created_at', name:'created_at'}, {data:'teacher_name', name:'teacher_name'}, {data:'training_module', name:'training_module'}, {data:'period', name:'period'}, {data:'turn', name:'turn'}, {data:'didactic_unit', name:'didactic_unit'}, {data:'checkin_time', name:'checkin_time'}, {data:'departure_time', name:'departure_time'}, {data:'theme', name:'theme'}, {data:'place', name:'place'}, {data:'educational_platforms', name:'educational_platforms'}, {data:'remarks', name:'remarks'}, ] }); */ }
问题排查关键点
- 查询构造器类型不匹配:
DB::table('assistance_teachers')->query()返回的是查询构造器实例,而DataTables::eloquent()要求传入Eloquent模型查询(即Model::query())。正常运行的代码用AssistanceTeacher::query()符合要求,TeacherController中应改用DataTables::of()替代DataTables::eloquent()来适配DB门面的查询。 - 路由参数传递:拆分后的
teacherajaxshow路由需传递teacher_id,前端Ajax的URL可改为"{{ route('teacherajaxshow') }}?teacher_id={{ $teacher->id }}",并在ajaxshow方法中通过$request->teacher_id获取参数添加到查询条件。 - 响应完整性:拆分后的
ajaxshow方法未处理非Ajax请求,需添加默认返回(如return abort(404);),避免空响应引发前端错误。 - 参数顺序验证:初始版
show方法参数顺序(Teacher $teacher, Request $request)符合Laravel依赖注入规则,但可尝试调整为(Request $request, Teacher $teacher)排除潜在顺序问题。
内容的提问来源于stack exchange,提问作者Elard Guevara
相关产品推荐
相关产品推荐

