Laravel Excel导入时如何跳过验证失败项继续导入剩余数据
Laravel Excel 导入跳过无效行解决方案
方案1:使用官方 SkipsFailures 特性(验证错误场景适用)
Laravel Excel 3.x+ 版本内置了验证失败跳过的能力,只需在导入类中实现对应接口即可,无需修改原有验证逻辑:
<?php namespace App\Imports; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithValidation; use Maatwebsite\Excel\Concerns\SkipsOnFailure; use Maatwebsite\Excel\Concerns\SkipsFailures; use App\Models\YourTargetModel; class DataImport implements ToModel, WithValidation, SkipsOnFailure { // 引入跳过失败的官方Trait use SkipsFailures; public function model(array $row) { // 原有字段映射逻辑无需修改 return new YourTargetModel([ 'name' => $row['name'], 'mobile' => $row['mobile'], // 其余字段映射 ]); } // 原有验证规则无需修改 public function rules(): array { return [ 'name' => 'required|string|max:100', 'mobile' => 'required|unique:users,mobile', // 其余验证规则 ]; } }
导入执行后可以通过以下方式获取所有跳过的错误行信息:
$import = new DataImport(); \Maatwebsite\Excel\Facades\Excel::import($import, request()->file('import_file')); // 遍历所有错误行信息 foreach ($import->failures() as $failure) { $rowNum = $failure->row(); // 错误行号 $errorMsg = $failure->errors(); // 当前行错误提示数组 $rowData = $failure->values(); // 当前行原始数据 }
方案2:手动捕获异常跳过(自定义业务校验场景适用)
如果除了基础验证规则外,还有自定义业务校验逻辑,需要跳过业务校验不通过的行,可以在单行处理逻辑中捕获异常,返回null即可跳过当前行,不会终止全局导入:
public function model(array $row) { try { // 自定义业务校验逻辑 if (!check_your_biz_rule($row)) { throw new \Exception('当前行不符合业务要求'); } return new YourTargetModel([ // 字段映射 ]); } catch (\Exception $e) { // 可自行记录错误日志 \Log::info('导入行跳过:'.$e->getMessage(), $row); // 返回null即跳过当前行 return null; } }
注意:若使用
ToCollection替代ToModel实现导入,只需在遍历集合时跳过无效行即可,无需额外配置。
内容的提问来源于stack exchange,提问作者Thanh Thuan
相关产品推荐
相关产品推荐

