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

Laravel使用Maatwebsite Excel导入xlsx数据无法存入数据库是什么原因

问题原因

  • 错误遍历单行数据:ToModel 接口的model()方法会自动逐行读取Excel内容,每次调用传入的$row本身就是单一行的列数据数组,你额外写foreach ($row as $data)属于遍历当前行的每一列值,逻辑完全不符合预期。
  • 重复判断逻辑失效:你用DB::table('tbl_pegawai')->where('nip', $row[0])->get()返回的是Laravel集合对象,哪怕没有匹配数据也会返回空集合,用empty()判断空集合永远返回false,所以写入逻辑永远不会触发。
  • 可能缺少模型批量赋值配置:如果你的PegawaiModel没有配置$fillable属性允许对应字段批量赋值,就算返回模型实例也会被Laravel过滤字段,无法写入数据库。

修复后的导入类代码

<?php

namespace App\Imports;

use App\Models\PegawaiModel;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithStartRow;

class ImportPegawai implements ToModel, WithStartRow
{
    public function model(array $row)
    {
        // 直接判断nip是否存在,用exists()判断效率更高
        $exists = PegawaiModel::where('nip', $row[0])->exists();
        if (!$exists) {
            return new PegawaiModel([
                'nip'           => $row[0],
                'nama_lengkap'  => $row[1],
                'pangkat'       => $row[2],
                'gol'           => $row[3],
                'jabatan'       => $row[4],
                'unit_kerja'    => $row[5]
            ]);
        }
        // 重复数据返回null即可跳过写入
        return null;
    }

    public function startRow(): int
    {
        return 3;
    }
}

额外检查项

确认PegawaiModel中配置了$fillable属性允许对应字段批量赋值,示例如下:

// PegawaiModel.php
protected $fillable = [
    'nip',
    'nama_lengkap',
    'pangkat',
    'gol',
    'jabatan',
    'unit_kerja'
];

同时检查数据库tbl_pegawai表的字段类型、长度与导入数据匹配,必填字段没有缺失值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:04