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
相关产品推荐
相关产品推荐

