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
相关产品推荐
相关产品推荐

