File:
如果在上传的文件中名称字段重复,如何显示验证消息?
<?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
)传递给自定义规则。