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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:05:07