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

Laravel Resource控制器update可取到值但数据库表未更新

Laravel update方法执行无报错但数据库不更新修复

问题表现

  • 技术栈:Laravel + Blade模板 + Resource资源控制器实现CRUD
  • 异常现象:update方法可正常执行,校验后能拿到完整表单提交数据,执行更新逻辑后数据库对应记录无任何变化,无报错抛出。

根因分析

核心故障为路由隐式模型绑定失效:
定义的data-produk资源路由,默认生成的PUT路由参数名为data_produk,但控制器update方法中类型提示的参数名为$product,二者名称不匹配,Laravel无法自动将路由中的ID对应到Produk模型实例,只会注入一个全新的空Produk模型。此时执行查询时$product->ID_produk值为null,where条件匹配不到任何数据库记录,update语句影响行数为0,因此数据库无变化。

修复方案

核心修复(二选一即可)

方案1:调整控制器参数名适配默认路由参数

修改update方法参数名和路由默认参数保持一致,可直接调用模型实例更新,无需手动写where条件:

public function update(Request $request, Produk $data_produk)
{
    $validatedData = $request->validate([
        'nama_produk' => ['required'],
        'deskripsi_produk' => ['required'],
        'harga_produk' => ['required'],
        'slug' => ['required'],
        'stock' => ['required']
    ]);
    // 直接使用路由绑定的模型执行更新
    $data_produk->update($validatedData);   
            
    return back()->with('berhasilEdit', 'Data produk berhasil diedit!');
}

方案2:自定义路由参数名适配现有控制器

在路由定义处手动指定资源路由参数名为product,和控制器现有$product参数匹配,原有控制器逻辑无需修改:

Route::resource('/admin/data-produk', AdminProdukController::class)
    ->parameters(['data-produk' => 'product'])
    ->middleware('auth');

可选优化(非故障必须修复)

现有Blade模板的textarea标签和输出变量之间存在换行缩进,会导致提交的产品描述字段前带大量多余空白,调整写法即可解决:

<div class="mb-3">
    <label for="deskripsi_produk" class="col-form-label">Deskripsi:</label>
    <textarea class="form-control" name="deskripsi_produk" id="deskripsi_produk" rows="10">{{ $product->deskripsi_produk }}</textarea>
</div>

验证

移除调试用的dd()代码后提交编辑表单,数据库对应记录即可正常更新,页面跳转后可看到成功提示。

内容的提问来源于stack exchange,提问作者Ken Arya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:57:22