You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:54:54