Laravel更新数据库字段报错:Resource item not found. 求助
Laravel更新数据库字段时"Resource item not found"错误排查与解决
错误原因
- 传入的
merchant_id无对应数据库记录:Merchants_data::find($merchant_id)未找到匹配记录时返回null,后续直接操作$merchants->fees会触发错误,框架捕获后返回该提示。 - 路由与模型绑定不规范:手动处理ID查找时缺少存在性校验,或路由参数与模型主键规则不匹配。
- 请求方式不匹配:路由使用
patch方法,前端未正确伪造请求方式,导致未命中目标路由,转而触发其他返回该错误的路由。
解决方案
1. 添加记录存在性校验
在控制器update方法中先检查是否找到商户记录,提前拦截错误:
public function update(Request $request, $merchant_id) { $request->validate([ 'fees'=>'required', ]); $merchants = Merchants_data::find($merchant_id); // 检查记录是否存在 if (!$merchants) { // API场景返回JSON错误 return response()->json(['error' => 'Resource item not found.'], 404); // 页面场景返回带错误提示的重定向 // return redirect('/manage_merchants')->with('error', '商户不存在'); } $merchants->fees = $request->get('fees'); $merchants->save(); return redirect('/manage_merchants')->with('success', 'Transaction Fee updated.'); }
2. 使用Laravel隐式模型绑定(推荐)
利用Laravel的自动模型注入,自动处理记录查找与404响应,代码更简洁规范:
- 修改路由:
Route::patch('update_merchant/{merchant}', 'MerchantsController@update')->name('update');
- 修改控制器方法:
public function update(Request $request, Merchants_data $merchant) { $request->validate([ 'fees'=>'required', ]); $merchant->fees = $request->get('fees'); $merchant->save(); return redirect('/manage_merchants')->with('success', 'Transaction Fee updated.'); }
注意:路由参数名
{merchant}必须与方法参数的模型变量名$merchant一致,Laravel会自动根据模型主键查找记录,找不到则直接返回404响应。
3. 确保请求方式正确
前端表单需通过@method('PATCH')伪造patch请求(Laravel不支持表单直接发送patch请求):
<form action="{{ route('update', ['merchant' => $merchant->id]) }}" method="POST"> @csrf @method('PATCH') <input type="text" name="fees" value="{{ $merchant->fees }}"> <button type="submit">更新手续费</button> </form>
4. 检查模型主键配置(若主键非默认id)
如果Merchants_data模型的主键不是id,需在模型中指定:
class Merchants_data extends Model { protected $primaryKey = 'merchant_id'; // 替换为实际主键字段名 }
内容的提问来源于stack exchange,提问作者Nosi Ishmael
相关产品推荐
相关产品推荐

