更新多图片项目记录时出现SQLSTATE[42S22]列不存在错误
问题原因与修复方案
错误根源
你遇到的SQLSTATE[42S22]错误,核心原因是$input数组被错误构造成混合索引+关联的数组:
- 处理图片上传时,你初始化
$input = [],然后用$input[]= $name和array_push($input, $name),导致数组出现0、1这类数字索引键 - 后续给
$input添加name、start_date等字符串键时,Laravel的update()方法会把所有键(包括数字索引)当作数据库列名,而你的表中没有0这个列,因此触发报错
另外这段代码还存在重复添加文件名的问题($input[]=和array_push重复执行)。
修复代码
1. 修正图片上传与数组构造逻辑
确保$input始终是关联数组,将图片文件名收集到$input['material']字段中(假设你的projects表中material字段为JSON类型,用于存储多张图片路径):
$this->validate($request, [ 'name' => 'required', 'start_date' => 'required', 'end_date' => 'required', 'project_type' => 'required', // 更新时允许不提交图片,仅当有上传时验证文件规则 'material.*' => 'nullable|mimes:jpeg,png,jpg,gif,svg|max:2048' ]); if ($request->id) { // 初始化input为关联数组,避免出现数字索引 $input = []; if ($request->hasfile('material')) { $materialPaths = []; foreach($request->file('material') as $file) { $name = time() . $file->getClientOriginalName(); // 修正路径拼接方式,避免语法错误 $file->move(public_path('image/project'), $name); $materialPaths[] = $name; } // 将图片路径数组赋值给material字段 $input['material'] = $materialPaths; } else { // 无新图片上传时,保留原有记录的图片路径 $project = Project::find($request->id); $input['material'] = $project->material; } // 填充其他业务字段 $input['name'] = $request->name; $input['start_date'] = $request->start_date; $input['end_date'] = $request->end_date; $input['amount'] = $request->amount; $input['notes'] = $request->notes; $input['api'] = $request->api; $input['project_type'] = $request->project_type; $input['domain'] = $request->domain; $input['content_type'] = $request->content_type; $input['content_description'] = $request->content_description; Project::where('id', $request->id)->update($input); return back()->with('success', 'Updated Successfully!'); }
2. 模型关键配置
确保你的Project模型中,将material字段配置为自动转换为数组,适配JSON类型存储:
// app/Models/Project.php class Project extends Model { protected $casts = [ 'material' => 'array', // 其他需要类型转换的字段... ]; }
3. 额外优化点
- 原代码中
public_path().'/image/project/'.$name的路径拼接方式易出错,改为public_path('image/project')作为目标目录更安全 - 更新场景下移除
'material' => 'required'验证规则,避免用户未修改图片时触发验证失败
内容的提问来源于stack exchange,提问作者Muhammad Muzammil
相关产品推荐
相关产品推荐

