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

Laravel Controller中关联发票服务表的多动态行update方法编写求助

实现逻辑说明

你需要按「删除弃用行→更新原有行→新增新行」的顺序处理,完整update方法代码如下:

public function update(Request $request, $id)
{
    // 1、找到对应发票实例
    $invoice = Invoices::findOrFail($id);
    // 2、获取提交的所有服务行数据,键为服务ID/新增行临时标识
    $designations = $request->designation ?? [];
    $QTEs = $request->QTE ?? [];
    $PUs = $request->PU ?? [];

    // 3、处理删除:提取提交的所有服务行的ID,删除不在提交列表里的旧服务
    $submittedServiceIds = collect(array_keys($designations))
        ->filter(fn($key) => is_numeric($key)) // 过滤掉新增行的临时标识,只取原有服务ID
        ->toArray();
    // 删除当前发票下,ID不在提交列表里的服务(即用户在前端删除的行)
    invoice_services::where('invoice_id', $id)
        ->whereNotIn('id', $submittedServiceIds)
        ->delete();

    // 4、遍历所有提交的行,分别处理更新和新增
    foreach ($designations as $key => $designation) {
        $qte = $QTEs[$key] ?? 0;
        $pu = $PUs[$key] ?? 0;
        $total = $qte * $pu;

        if (is_numeric($key)) {
            // 数字键为原有服务,执行更新
            $service = invoice_services::where('id', $key)
                ->where('invoice_id', $id)
                ->first();
            if ($service) {
                $service->update([
                    'designation' => $designation,
                    'QTE' => $qte,
                    'PU' => $pu,
                    'total' => $total
                ]);
            }
        } else {
            // 非数字键为新增行(新增行name属性用new_前缀的临时标识,比如new_1、new_2),执行新增
            invoice_services::create([
                'invoice_number' => $invoice->invoice_number,
                'invoice_id' => $id,
                'designation' => $designation,
                'QTE' => $qte,
                'PU' => $pu,
                'total' => $total
            ]);
        }
    }

    // 补充你自己的其他发票主字段更新逻辑、跳转逻辑即可
    return redirect()->route('invoices.index')->with('success', '发票更新成功');
}

配套适配调整

  • 前端新增行适配:修改动态新增行的JS逻辑,给新增行的input的name属性设置new_前缀的键,避免和原有服务ID冲突,示例如下:
// 新增行时的示例代码,incrementalRow为自增的临时序号
let newRow = `
<tr>
    <td><input type="text" name="designation[new_${incrementalRow}]" class="form-control"></td>
    <td><input type="text" name="QTE[new_${incrementalRow}]" class="form-control"></td>
    <td><input type="text" name="PU[new_${incrementalRow}]" class="form-control"></td>
    <td><input type="text" class="form-control form-control-lg" name="total[new_${incrementalRow}]" readonly ></td>
</tr>
`;
  • 路由调整:确保update路由配置了ID参数,示例:
Route::put('/invoices/{id}', [InvoiceController::class, 'update'])->name('invoices.update');

内容的提问来源于stack exchange,提问作者Salah Eddine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:15:02