Laravel 8 CMS用户资料编辑提交报错:SQLSTATE[HY000]: General error: 1364 Field 'password' doesn't have a default value
问题分析与解决方案
嘿,这个错误的根源其实很明显——你在控制器里创建了一个新的User实例,而不是更新当前登录的用户!
看这段代码:
$user = new User();
当你调用$user->save()时,Laravel会尝试向users表插入一条新记录,但你的users表password字段没有默认值,新用户必须填写密码,所以就抛出了这个SQL错误。但我们的需求是更新现有用户的资料,不是创建新用户呀!
修复步骤
1. 获取当前登录用户进行更新
把创建新User实例的代码,替换成获取当前登录的用户:
// 替换 $user = new User(); 为下面二选一即可 $user = Auth::user(); // 或者更严谨的写法(如果用户登录状态异常会抛出404) $user = User::findOrFail(Auth::id());
这样操作的就是已经存在的用户记录,执行save()时Laravel会执行UPDATE语句,而不是INSERT,自然不会触发新用户的必填字段验证。
2. 完善表单的文件上传属性(重要!)
你的表单包含文件输入(头像上传),必须在form标签里加上enctype="multipart/form-data",否则文件根本传不到控制器里:
<form method="POST" action="{{ route('profile.info.confirm') }}" enctype="multipart/form-data">
3. 可选优化:处理旧头像(如果需要)
如果用户上传了新头像,你可能需要删除旧的头像文件并删除对应的Photo记录,避免垃圾文件堆积,比如:
if($file = $request->file('avatar')){ // 如果用户已有头像,先删除旧文件和记录 if($user->photo){ // 注意这里的路径要和你存储的路径一致 unlink(public_path('images/' . $user->photo->path)); $user->photo->delete(); } // 下面是你原来的头像保存逻辑 $name = time() . $file->getClientOriginalName(); $file->move('images', $name); $photo = new Photo(); $photo->name = $file->getClientOriginalName(); $photo->path = $name; $photo->user_id = Auth::id(); $photo->save(); $user->photo_id = $photo->id; }
4. 优化验证规则
给email加上email验证规则,确保输入的是合法邮箱格式:
$data = $request->validate([ 'name' => 'required', 'email' => 'required|email', // 加上email验证 'avatar' => 'mimes:jpeg,jpg,png,gif|max:10000|nullable' ]);
修复后的完整控制器代码
public function postProfileInfo(Request $request) { $data = $request->validate([ 'name' => 'required', 'email' => 'required|email', 'avatar' => 'mimes:jpeg,jpg,png,gif|max:10000|nullable' ]); // 获取当前登录用户 $user = Auth::user(); if($file = $request->file('avatar')){ // 可选:删除旧头像文件和记录 if($user->photo){ unlink(public_path('images/' . $user->photo->path)); $user->photo->delete(); } $name = time() . $file->getClientOriginalName(); $file->move('images', $name); $photo = new Photo(); $photo->name = $file->getClientOriginalName(); $photo->path = $name; $photo->user_id = Auth::id(); $photo->save(); $user->photo_id = $photo->id; } $user->name = $data['name']; $user->email = $data['email']; $user->save(); return redirect('/admin'); }
这样修改后,提交表单就只会更新当前用户的姓名、邮箱和头像,不会触发密码字段的错误啦!
内容的提问来源于stack exchange,提问作者user9277271
相关产品推荐
相关产品推荐

