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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 01:36:04