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

如何在Laravel中使用maatwebsite/excel导入Excel数据并对重复值去重入库

Laravel maatwebsite/excel 导入Excel去重实现方案

实现思路:通过firstOrCreate方法实现数据库层面的重复判断,存在则跳过插入,不存在则新建记录,同时可根据需求增加Excel内部数据去重逻辑。

步骤1:创建导入类

执行Artisan命令生成导入类文件:
php artisan make:import UsersImport --model=User
注:将UsersImport和User替换为你实际业务对应的导入类名和模型名

步骤2:编写导入去重逻辑

这里以email作为去重判断字段为例,你可根据实际需求替换为自定义字段:

<?php

namespace App\Imports;

use App\Models\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow; // Excel有表头时引入该接口

class UsersImport implements ToModel, WithHeadingRow
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        // 第一个参数为重复判断条件,满足条件则查询已有记录,不重复插入
        return User::firstOrCreate(
            ['email' => $row['email']],
            [
                'name' => $row['name'],
                'phone' => $row['phone'],
                // 补充其他需要入库的字段
            ]
        );
    }
}

步骤3:控制器调用导入

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\UsersImport;

class ExcelImportController extends Controller
{
    public function import(Request $request)
    {
        // 上传文件校验
        $request->validate([
            'excel_file' => 'required|file|mimes:xlsx,xls,csv'
        ]);

        // 执行导入
        Excel::import(new UsersImport, $request->file('excel_file'));

        return back()->with('success', '导入完成,重复数据已自动过滤');
    }
}

补充说明

  • 多字段去重:如果需要多个字段同时相同才判定为重复,将多个字段放入firstOrCreate的第一个参数数组即可,示例:
    User::firstOrCreate(
        ['email' => $row['email'], 'id_card' => $row['id_card']],
        // 其他入库字段
    );
    
  • 数据库唯一索引:提前给对应去重字段添加唯一索引,避免并发导入时产生脏数据,SQL示例:
    ALTER TABLE users ADD UNIQUE INDEX unique_email (email);
  • Excel内部去重:如果Excel本身存在大量重复数据,可改用ToCollection接口先过滤Excel内的重复再入库,示例:
    use Maatwebsite\Excel\Concerns\ToCollection;
    use Illuminate\Support\Collection;
    
    class UsersImport implements ToCollection, WithHeadingRow
    {
        public function collection(Collection $rows)
        {
            // 先对Excel内数据按指定字段去重
            $uniqueRows = $rows->unique('email');
            
            foreach ($uniqueRows as $row) {
                User::firstOrCreate(
                    ['email' => $row['email']],
                    ['name' => $row['name'], 'phone' => $row['phone']]
                );
            }
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:48:04