Laravel如何更新数据?Vue发起更新请求后用户数据未生效问题求助
问题原因排查
- 前端请求传参逻辑错误:axios的
put方法第二个参数才是请求体数据,你当前的写法是直接把this.user对象拼接到URL末尾,最终请求路径会变成类似api/user/1[object Object],后端既匹配不到路由,也拿不到你要更新的用户数据。 - 后端验证逻辑无效:你写了验证逻辑生成了
$data变量,但实际更新时用的是未经过验证的$request->all(),既浪费了验证逻辑,也有安全风险;同时所有字段的验证规则为空,没有加sometimes规则,在字段值为空时可能触发异常。 - 未确认User模型的批量赋值配置:Laravel的
update方法属于批量赋值,需要你在User模型的$fillable属性中声明所有允许更新的字段,否则更新会被静默忽略。
修复代码
1. Vue部分editUser方法
editUser(){ console.log(this.user) this.$axios // 第一个参数为请求路径,第二个参数传入要更新的用户数据 .put('api/user/' + this.$route.params.id, this.user) .then((response) => { console.log(response.data) }) .catch((err) => { console.log(err) }) }
2. Laravel控制器updateUser方法
public function updateUser(Request $request, User $user){ // 加sometimes规则,仅请求中存在该字段时才验证 $data = $request->validate([ 'username' => 'sometimes|string', 'firstname' => 'sometimes|string', 'lastname' => 'sometimes|string', 'email' => 'sometimes|email|unique:users,email,'.$user->id, 'password' => 'sometimes|string|min:6', 'phone_number' => 'sometimes|numeric', 'role' => 'sometimes|string', 'companyID' => 'sometimes|integer', 'companyRole' => 'sometimes|string', ]); // 密码传入时自动加密再存储 if (isset($data['password'])) { $data['password'] = bcrypt($data['password']); } // 使用经过验证的数据更新 $user->update($data); return $user; }
3. 检查User模型$fillable配置
确认app/Models/User.php中已声明所有允许更新的字段:
protected $fillable = [ 'username', 'firstname', 'lastname', 'email', 'password', 'phone_number', 'role', 'companyID', 'companyRole', ];
修复后可打开浏览器控制台的网络标签,确认PUT请求路径、请求体参数是否符合预期,同时查看后端返回的响应排查其他异常。
内容的提问来源于stack exchange,提问作者Moemen Hussein
相关产品推荐
相关产品推荐

