问题描述
我正在按照文档中的 this 示例来处理多张工作表导入。
我的控制器:
public function import(Request $request) {
$file = $request->file('import')->store('/storage');
$import = new MultisheetContactsImport();
$import->import($file);
if ($import->failures()->isNotEmpty()) {
return $import->failures();
}
return $import->getRowCount();
}
我的导入类 ContactsImport.PHP
namespace App\Imports;
use App\Models\Email;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\withheadingRow;
use Maatwebsite\Excel\Concerns\SkipsOnError;
use Maatwebsite\Excel\Concerns\SkipsErrors;
use Maatwebsite\Excel\Concerns\Importable;
use Maatwebsite\Excel\Concerns\WithValidation;
use Maatwebsite\Excel\Concerns\SkipsOnFailure;
use Maatwebsite\Excel\Concerns\SkipsFailures;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\Validator;
use Throwable;
class ContactsImport implements ToModel,withheadingRow,SkipsOnError,WithValidation,SkipsOnFailure
{
private $rows = 0;
use Importable,SkipsErrors,SkipsFailures;
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
++$this->rows;
return new Email([
'apiKey' => Str::random(16),'firstname' => $row['firstname'],'lastname' => $row['lastname'],'emailAddress' => $row['emailaddress'],'businessType' => $row['businesstype'],'allowed' => true,'updates' => true,'marketing' => true,]);
}
public function getRowCount(): int
{
return $this->rows;
}
public function rules(): array
{
return [
'*.emailaddress' => ['email','unique:emails,emailaddress']
];
}
}
我的多表导入类 MultisheetContactsImport.PHP
class MultisheetContactsImport extends ContactsImport implements WithMultipleSheets
{
public function sheets(): array
{
return [
'Contacts' => new ContactsImport()
];
}
}
如果我使用没有多表的 ContactsImport 类,则方法失败和 getRowCount 工作正常,但是现在我只得到响应 0
解决方法
只需使用 try catch 块包装您的导入行代码,它应该可以处理所有事情:
try {
$master = Excel::import(new MasterImport($auth),$request->file('master_upload'));
} catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
$failures = $e->failures();
dd($failures);
foreach ($failures as $failure) {
$failure->row(); // row that went wrong
$failure->attribute(); // either heading key (if using heading row concern) or column index
$failure->errors(); // Actual error messages from Laravel validator
$failure->values(); // The values of the row that has failed.
}
}
,
你可以在你的ImportClass上添加这个方法
/**
* @param Failure ...$failures
* @throws ValidationException
*/
public function onFailure(Failure ...$failures)
{
$exception = ValidationException::withMessages(collect($failures)->map->toArray()->all());
throw $exception;
}
用户 Laravel 验证例外
use Illuminate\Validation\ValidationException;
然后在视图上显示验证消息:
@if(count($errors->getMessages()) > 0)
<div class="alert alert-danger alert-dismissible" role="alert">
<strong>Validation Errors:</strong>
<ul>
@foreach($errors->getMessages() as $errorMessages)
@foreach($errorMessages as $errorMessage)
<li>
{{ $errorMessage }}
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
</li>
@endforeach
@endforeach
</ul>
</div>@endif