Laravel 8中直接调用模型update方法执行更新操作失效问题求解
问题原因
你原来的代码存在两处语法错误,同时可能缺少Laravel模型批量赋值的必要配置,才会导致update传参方式不生效:
- 数组键名错误:update方法传入的关联数组键必须是你要更新的模型字段名(也就是
orderId/fileId/status),而非$data->字段名这种错误写法 - 变量解析错误:你把参数值放在了单引号里,PHP单引号不会解析内部变量,实际传入的是
$request->orderId这个固定字符串,而不是请求参数对应的值 - 批量赋值配置缺失:Laravel为了防止批量赋值漏洞,通过update方法批量更新的字段必须提前在模型的
$fillable属性中声明,或者设置$guarded = []关闭批量赋值限制
修复步骤
1. 先配置FileLogs模型的批量赋值规则
打开app/Models/FileLogs.php,在类内添加允许批量更新的字段声明:
protected $fillable = ['orderId', 'fileId', 'status'];
如果不需要限制批量赋值的字段,也可以设置:
protected $guarded = [];
2. 修改控制器中的update代码
把原来update方法的传参数组修改为正确格式:
public function update(Request $request,$id){ $validator = Validator::make( $request->all(), [ 'orderId' => 'required|integer', 'fileId' => 'required|integer', 'status' => 'required|string' ] ); if ($validator->fails()) { return response()->json($validator->errors(), 400); } $data = FileLogs::findOrFail($id); $updateResult = $data->update([ 'orderId' => $request->orderId, 'fileId' => $request->fileId, 'status' => $request->status ]); return response()->json(['status'=>'success','StatusCode'=> 200,'message'=>'Successfully Updated','data'=>$data]); }
这里额外把find改成了findOrFail,如果对应id的记录不存在会直接返回404错误,避免后续调用update时报空对象错误。
补充说明
修改后通过update传参的方式会正常触发模型的updated事件,和你之前先赋值再调用无参update的效果完全一致。
内容的提问来源于stack exchange,提问作者user16124793
相关产品推荐
相关产品推荐

