Laravel8更新带图片用户资料:图片上传成功但数据库未更新
问题定位
头像上传成功但数据库不更新的核心原因是控制器赋值逻辑遗漏:你已经完成了图片上传、拿到了新图片的存储路径,但是在给DetailUser模型赋值待更新字段时,没有给photo属性传值,最终执行save()时自然不会更新该字段。
你当前控制器里的DetailUser赋值代码如下,确实缺失photo字段的赋值:
$detail_user->role = $request_detail_user->input('role'); $detail_user->contact_number = $request_detail_user->input('contact_number'); $detail_user->biography = $request_detail_user->input('biography'); $detail_user->save();
修复方案
按以下步骤调整即可解决问题:
- 补全photo字段的模型赋值
在调用$detail_user->save()之前,加上photo字段的赋值逻辑,把你之前处理好的存储路径传给模型属性:$detail_user->role = $request_detail_user->input('role'); $detail_user->contact_number = $request_detail_user->input('contact_number'); $detail_user->biography = $request_detail_user->input('biography'); // 补上这行,把上传后的新路径赋值给模型 if (isset($data_detail_user['photo'])) { $detail_user->photo = $data_detail_user['photo']; } $detail_user->save(); - 检查模型批量赋值白名单
打开app/Models/DetailUser.php文件,确认photo字段已经加入$fillable数组,否则会被Laravel的批量赋值保护拦截,导致字段无法写入:protected $fillable = [ 'user_id', 'role', 'contact_number', 'biography', 'photo', // 确认有这行 ];
可选优化(规避后续潜在问题)
- 移除冗余查询:当前代码重复查询了两次User、两次DetailUser,属于无用逻辑,删掉重复查询行即可:
// 删除这行冗余查询 // $user = User::find(Auth::user()->id); $user = User::where('id', Auth::user()->id)->first(); // 删除这行冗余查询 // $detail_user = DetailUser::find($user->detail_user->id); $detail_user = DetailUser::where('id', $user->detail_user->id)->first(); - 修正旧文件删除逻辑:当前旧文件删除的路径拼接有误,容易出现旧头像删不干净的问题,改用指定public磁盘的方式操作存储,路径不需要额外拼接前缀:
if (isset($data_detail_user['photo']) && $detail_user->photo) { // 直接操作public磁盘,路径就是数据库存的相对路径 if (Storage::disk('public')->exists($detail_user->photo)) { Storage::disk('public')->delete($detail_user->photo); } } - 简化前端头像路径渲染:当前Blade里写死了
assets/photo路径前缀,后续如果改存储目录需要改多处,直接拼接storage路径即可:<img src="{{ asset('storage/'. auth()->user()->detail_user->photo) }}" alt="photo profile" class="w-16 h-16 rounded-full">
改完之后重新上传头像测试,数据库photo字段就会正常同步新的文件路径了。
内容的提问来源于stack exchange,提问作者Lana Septiana
相关产品推荐
相关产品推荐

