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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:33:30