如何验证如果在上传的文件名称是重复的?



如果在上传的文件中名称字段重复,如何显示验证消息?

<?php
namespace AppImports;
use AppModelsCustomer;
use IlluminateSupportCollection;
use MaatwebsiteExcelConcernsToCollection;
use MaatwebsiteExcelConcernsWithHeadingRow;
use MaatwebsiteExcelConcernsWithValidation;
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, testaddress

AAA, testaddress1

BBB, address2

现在我得到照亮数据库QueryExceptionSQLSTATE[23000]: Integrity constraint violation: 1062 .

我的控制器代码如下:

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 (MaatwebsiteExcelValidatorsValidationException $e) {
$failures = $e->failures();
return redirect()
->route('customers.upload')
->withErrors($failures);
}
return redirect()
->route('customers.index')
->with('success', __('customers.message_uploaded'));
}

您可以通过创建自定义验证规则来实现这一点。使用Maatwebsite库的一个示例实现可以是:

File:appRulesCsvUnique.php

namespace AppRules;
use AppImportsCustomerImport;
use IlluminateContractsValidationRule;
use MaatwebsiteExcelFacadesExcel;
class CsvUnique implements Rule
{
public function __construct($column)
{
$this->column = $column;
}
public function passes($attribute, $value)
{
$data = Excel::toArray(new CustomerImport(), $value);
$names = array_map(function($i) {
return $i[0];
}, array_slice($data[0],1));
return count($names) === count(array_unique($names));
}
public function message()
{
return 'The :attribute has already been taken.';
}
}

然后你可以像这样在你的验证逻辑中使用它:

$request->validate(
['file' => ['required', 'file', 'mimes:txt,csv', new CsvUnique('name')]],
['file.required' => 'Please upload the file']
);

注意我们将列名称(在本例中为name)传递给自定义规则。

最新更新