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

