#excel #laravel #api #maatwebsite-excel
#excel #laravel #API #веб-сайт maatwebsite-excel
Вопрос:
С помощью этого процесса я могу загружать данные, содержащиеся в большом файле Excel, если в очереди возникнут какие-либо проблемы с проверкой, он пропустит и загрузит оставшиеся файлы. Но я не знаю, как я могу получить эти ошибки проверки через API. Я использовал if ($import->failures()->isNotEmpty())
способ проверки наличия каких-либо ошибок, которые, как я знаю, не будут работать. Предложите мне лучший способ получить эти ошибки проверки.
На моем ImportController
public function import(Request $request)
{
$rules = [
'file' => 'required|mimes:xlsx,xls',
'type' => 'filled|string|not_in:null',
];
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
$errors = $validator->errors();
return response()->json($errors, 404);
}
$type = $request->input('type');
$file = $request->file;
$fileName = time() . '--u-' . auth()->user()->id . '.' .$file->extension();
$location = $file->storeAs('importFile/applicationFile' , $fileName);
$import = new ApplicationImport;
$import->import($location);
if ($import->failures()->isNotEmpty()) {
return response()->json(['response' => 'Imported! And have some errors!', 'errors' =>
$import->failures()], 404);
}
return response()->json(['response' => 'File send to queue! Worker will import it.'], 200);
}
В ApplicationImport (используя Maatwebsite Excel)
namespace AppImports;
use AppModelsApplication;
use MaatwebsiteExcelConcernsToModel;
use MaatwebsiteExcelConcernsImportable;
use IlluminateContractsQueueShouldQueue;
use MaatwebsiteExcelConcernsSkipsFailures;
use MaatwebsiteExcelConcernsSkipsOnFailure;
use MaatwebsiteExcelConcernsWithHeadingRow;
use MaatwebsiteExcelConcernsWithValidation;
use MaatwebsiteExcelConcernsWithBatchInserts;
use MaatwebsiteExcelConcernsWithChunkReading;
class ApplicationImport implements ToModel, WithHeadingRow, WithValidation, WithBatchInserts, WithChunkReading, ShouldQueue, SkipsOnFailure
{
use Importable, SkipsFailures;
public function rules(): array
{
return [
'*.title' => ['required', 'string', 'max:100', 'unique:applications'],
'*.user_id' => ['required', 'numeric'],
'*.company_id' => ['required', 'numeric'],
'*.course_id' => ['required', 'numeric'],
'*.coursetype_id' => ['required', 'numeric'],
'*.institution_id' => ['required', 'numeric'],
'*.status_id' => ['required', 'numeric'],
'*.internal_ref' => ['required', 'string', 'max:255'],
'*.external_ref' => ['required', 'string', 'max:255'],
'*.intake_month' => ['required', 'string', 'max:255'],
'*.intake_year' => ['required', 'numeric', 'min:4'],
'*.tution_fee' => ['required', 'numeric'],
'*.administration_charge' => ['required', 'numeric'],
'*.created_by' => ['required', 'numeric']
];
}
public function genUID()
{
$app_uid = 'USR-' . mt_rand(10000000, 99999999);
if ($this->uidNumberExists($app_uid)) {
return $this->genUID();
} else {
return $app_uid;
}
}
public function uidNumberExists($app_uid)
{
return Application::Where('uid', $app_uid)->exists();
}
/**
* @param array $row
*
* @return IlluminateDatabaseEloquentModel|null
*/
public function model(array $row)
{
return new Application([
'uid' => $this->genUID(),
'title' => $row['title'],
'user_id' => $row['user_id'],
'company_id' => $row['company_id'],
'course_id' => $row['course_id'],
'coursetype_id' => $row['coursetype_id'],
'institution_id' => $row['institution_id'],
'status_id' => $row['status_id'],
'internal_ref' => $row['internal_ref'],
'external_ref' => $row['external_ref'],
'intake_month' => $row['intake_month'],
'intake_year' => $row['intake_year'],
'tution_fee' => $row['tution_fee'],
'administration_charge' => $row['administration_charge'],
'created_by' => $row['created_by'],
]);
}
public function batchSize(): int
{
return 1000;
}
public function chunkSize(): int
{
return 1000;
}
}
Ответ №1:
Вы должны переместить код вашего контроллера в очередь / задание, где вы можете получать сбои, а затем вы можете получить доступ через Pusher, если вы используете. Если вы не реализуете ShouldQueue при импорте, возможно, вы можете получить сбои.