【发布时间】:2021-10-18 15:45:48
【问题描述】:
如果上传文件中的名称字段重复,如何显示验证消息?
<?php
namespace App\Imports;
use App\Models\Customer;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithValidation;
class CustomerImport implements ToCollection, WithHeadingRow, WithValidation
{
public $timestamps = false;
public function collection(Collection $rows)
{
foreach ($rows as $row) {
Customer::create([
'name' => $row['name'],
'address' => $row['address'],
]);
}
}
public function rules(): array
{
return [
'name' => [
'required',
'max:50',
'unique:customers,name',
],
'address' => [
'required',
'max:50',
'unique:customers,address',
]
];
}
}
我上传的 csv 文件示例如下:名称“AAA”重复。所以我需要为文件中的重复条目显示验证错误消息。
姓名、地址
AAA,测试地址
AAA,testaddress1
BBB,地址2
现在我得到 Illuminate\Database\QueryException SQLSTATE[23000]:违反完整性约束:1062 Duplicate entry 'AAA' 错误。
我的控制器代码如下:
public function uploadFile(Request $request)
{
$request->validate(
['file' => ['required', 'file', 'mimes:txt,csv']],
['file.required' => 'Please upload the file']
);
try {
Excel::import(new CustomerImport(), $request->file('file'));
} catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
$failures = $e->failures();
return redirect()
->route('customers.upload')
->withErrors($failures);
}
return redirect()
->route('customers.index')
->with('success', __('customers.message_uploaded'));
}
【问题讨论】:
-
你在做这个吗? docs.laravel-excel.com/3.1/imports/…,即围绕这个逻辑添加
try { ... } catch (\Maatwebsite\Excel\Validators\ValidationException $e) { ... }? -
@Tim Lewis 是的,我已经在上面的控制器中添加了它(请检查 uploadFile())
-
有趣;我可以看到您的代码与示例代码的唯一真正区别是
$row[0]和$row['name']的用法,以及规则在public function rules()中引用0 => ...与'name' => ...的方式。看起来ValidationException从未被触发,但您必须深入了解原因。
标签: php laravel laravel-8 maatwebsite-excel