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

更新多图片项目记录时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:30:44