Laravel 9中如何通过jQuery DataTable(AJAX)传ID到控制器并获取数据
解决jQuery DataTable AJAX传递ID到Laravel控制器的问题
你的代码当前的核心问题是:{{ route('patientPayment.getData','id' ) }}中的'id'是静态字符串,并没有把JS变量id的实际值传递到路由里。下面提供两种可行的实现方式:
方法一:通过路由参数传递ID
这种方式把ID作为URL路径的一部分,需要先确保Laravel路由定义包含ID占位符:
1. 定义路由
// routes/web.php 或 routes/api.php Route::get('/patient-payment/{id}/data', [PatientPaymentController::class, 'getData'])->name('patientPayment.getData');
2. 前端JS代码修改
用JS动态替换Blade生成的路由中的占位符:
var id = $("#patient_id").val(); // 先让Blade生成带占位符的路由,再用实际ID替换 var ajaxUrl = '{{ route('patientPayment.getData', '__PATIENT_ID__') }}'.replace('__PATIENT_ID__', id); $('#patientPayment_table').DataTable({ processing: true, serverSide: true, ajax: ajaxUrl, columns: [{ "data": "id", render: function(data, type, row, meta) { return meta.row + meta.settings._iDisplayStart + 1; } }, { data: 'debit' }, { data: 'credit' }, { data: 'date' }, { data: 'description' }, { data: 'action' } ] });
3. 控制器接收参数
直接通过方法参数获取ID:
// app/Http/Controllers/PatientPaymentController.php public function getData($id) { // 根据ID查询患者的支付记录 $payments = \App\Models\PatientPayment::where('patient_id', $id)->get(); // 处理DataTables服务器端响应(如果使用yajra/laravel-datatables包) return \Yajra\DataTables\Facades\DataTables::of($payments)->make(true); }
方法二:通过AJAX请求参数传递ID
这种方式把ID作为查询字符串参数(比如?patient_id=123)传递,不需要修改路由结构:
1. 定义路由
Route::get('/patient-payment/data', [PatientPaymentController::class, 'getData'])->name('patientPayment.getData');
2. 前端JS代码修改
利用DataTables的ajax.data选项附加参数:
var id = $("#patient_id").val(); $('#patientPayment_table').DataTable({ processing: true, serverSide: true, ajax: { url: '{{ route('patientPayment.getData') }}', data: function(d) { // 将患者ID添加到请求参数中 d.patient_id = id; // d是DataTables自带的请求参数(分页、排序等),此处不会覆盖原有参数 } }, columns: [{ "data": "id", render: function(data, type, row, meta) { return meta.row + meta.settings._iDisplayStart + 1; } }, { data: 'debit' }, { data: 'credit' }, { data: 'date' }, { data: 'description' }, { data: 'action' } ] });
3. 控制器接收参数
通过Request对象获取查询参数:
public function getData(\Illuminate\Http\Request $request) { $id = $request->input('patient_id'); $payments = \App\Models\PatientPayment::where('patient_id', $id)->get(); return \Yajra\DataTables\Facades\DataTables::of($payments)->make(true); }
额外提示:动态更新表格
如果患者ID会动态变化(比如切换患者),可以通过以下方式刷新表格:
// 示例:切换患者后调用此函数更新表格 function updatePaymentTable(newPatientId) { var table = $('#patientPayment_table').DataTable(); // 方法一的更新方式:替换路由URL后重载 table.ajax.url('{{ route('patientPayment.getData', '__PATIENT_ID__') }}'.replace('__PATIENT_ID__', newPatientId)).load(); // 方法二的更新方式:直接重载(data函数会重新获取最新ID) // table.ajax.reload(); }
内容的提问来源于stack exchange,提问作者Javad
相关产品推荐
相关产品推荐

