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

Laravel/PHP中使用updateOrCreate()向MySQL插入图片和PDF的问题

问题根因

你代码中给image、cv字段赋值的是&&连接的逻辑表达式,PHP中逻辑运算的返回结果为布尔值(执行成功返回true、失败返回false),存入MySQL时会自动转换为1/0,这就是问题的核心原因。另外说明:常规开发中不会直接把文件内容存入数据库,默认都是存储文件的访问路径,你的原始代码逻辑也是要实现路径存储,所以下面按存路径的场景给出修复方案。

修复方案

先单独处理文件上传逻辑,拿到存储路径后再传入updateOrCreate方法,避免直接把逻辑表达式作为字段值,同时可以做到没传对应文件时不覆盖原有存储值:

// 初始化更新数据数组
$updateData = [];

// 处理图片上传逻辑
if ($request->hasFile('image')) {
    $imageExt = $request->image->getClientOriginalExtension();
    $imageName = $request->full_name . '.' . $imageExt;
    // 执行上传
    $request->image->move(public_path('uploads'), $imageName);
    // 存储相对路径,方便前端拼接域名访问
    $updateData['image'] = 'uploads/' . $imageName;
}

// 处理CV文件上传逻辑
if ($request->hasFile('cv')) {
    $cvExt = $request->cv->getClientOriginalExtension();
    $cvName = $request->user_id . '.' . $cvExt;
    // 执行上传
    $request->cv->move(public_path('uploads'), $cvName);
    $updateData['cv'] = 'uploads/' . $cvName;
}

// 执行更新或创建
$info = Info::updateOrCreate(
    ['user_id' => Auth::id()],
    $updateData
);
可选补充说明

如果确实有特殊需求要把文件二进制内容存入数据库:

  • 先把数据库对应image、cv字段类型改为longblob
  • 上传时赋值改为读取文件二进制内容:$updateData['image'] = file_get_contents($request->image->getRealPath());
  • 该方案会大幅提升数据库存储压力、降低查询效率,非特殊情况不推荐使用。

内容的提问来源于stack exchange,提问作者Fatih Can

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:08