Laravel提交更新表单时新增记录而非修改原有记录问题排查
问题根源
你遇到的是Laravel隐式模型绑定参数不匹配问题:
Laravel的隐式模型绑定要求路由参数名和控制器方法中注入的模型变量名完全一致,才能自动查询对应记录注入方法。你的路由定义的参数是{id},但update方法里注入的模型变量名是$alert,二者不匹配,导致框架注入了一个全新的空Alert模型实例,调用save()方法时就会新增记录而非更新原有记录。
解决方案(推荐第一种,符合Laravel常规开发规范)
- 方案1:修改路由参数名,和控制器变量名对齐
将两条路由的参数{id}改为{alert}即可:
Route::get('/alerts/edit/{alert}', 'AlertController@edit')->name('editAlert'); Route::put('/alerts/edit/{alert}', 'AlertController@update')->name('updateAlert');
修改后框架会自动根据路由传递的ID查询对应Alert实例注入update方法,调用save()时就会更新原有记录。
- 方案2:显式指定参数绑定(适用于不想修改路由参数名的场景)
在app/Providers/RouteServiceProvider.php的boot方法中添加绑定规则:
public function boot() { parent::boot(); Route::model('id', Alert::class); }
验证方法
你可以在update方法开头临时加一行dd($alert->id)测试:修改前打印结果为null,说明确实注入的是空模型;修改后会打印你要更新的记录ID,说明绑定生效。
内容的提问来源于stack exchange,提问作者SiriusPhil
相关产品推荐
相关产品推荐

