Я использую Laravel-Excel для импорта, и я использую такой же подход, как этот здесь , но я также хочу предоставить дополнительную информацию о том, какая проверка строки не удалась. Это мой метод в контроллере:
public function import(Request $request)
{
if ($request->hasFile('file')) {
$fuelsImport = new FuelsImport();
$fuelsImport->import($request->file('file'));
$fuelsValidationErrors = $fuelsImport->getErrors();
} else {
$fuelsValidationErrors = [];
}
notify()->success(__('smart.SuccessfullyImportMessage'));
return redirect()->back()->with('validation_errors', $fuelsValidationErrors);
}
и это мой класс FuelsImport
class FuelsImport implements ToCollection, WithHeadingRow, WithValidation, SkipsOnFailure
{
use Importable, SkipsFailures;
private $errors = [];
public function collection(Collection $rows)
{
$rows = $rows->toArray();
foreach ($rows as $key => $row) {
if ($row['datum_transakcije']) {
$dateOfTransaction = Carbon::createFromFormat('d.m.Y H:i:s', $row['datum_transakcije']);
/** @var Vehicle $vehicle */
$vehicle = Vehicle::where('registration', $row['nosilac_kartice'])->first();
if (!$vehicle) {
$row['nosilac_kartice'] = -1;
}
$authorization = null;
if ($vehicle) {
$authorization = $vehicle->authorizations()->where('start', '<=', $dateOfTransaction)
->where(function ($query) use ($dateOfTransaction) {
$query->where('end', '>=', $dateOfTransaction)->orWhereNull('end');
})->first();
}
if (!$authorization) {
$row['datum_transakcije'] = -1;
}
$typeOfFuel = TypeOfFuel::where('name', $row['naziv_proizvoda'])->first();
if (!$typeOfFuel) {
$row['naziv_proizvoda'] = -1;
}
$validator = Validator::make($row, $this->rules(), $this->validationMessages());
if ($validator->fails()) {
foreach ($validator->errors()->messages() as $messages) {
foreach ($messages as $error) {
$this->errors[] = $error;
}
}
} else {
/** @var Fuel $fuel */
$fuel = new Fuel();
$fuel->account_number = $row['broj_racuna'];
$fuel->date = Carbon::parse($dateOfTransaction)->format('d.m.Y');
$fuel->type_of_fuel_id = $typeOfFuel->id;
$fuel->authorization_id = $authorization->id;
$fuel->amount = $row['kol'];
$fuel->price = $row['cena'];
$fuel->total = $row['total'];
$fuel->kilometers_read = $row['kilometraza'];
$fuel->vehicle_id = $vehicle->id;
$fuel->save();
}
}
}
}
public function headingRow(): int
{
return 2;
}
public function getErrors()
{
return $this->errors;
}
public function rules(): array
{
return [
'datum_transakcije' => 'string',
'nosilac_kartice' => 'string',
'naziv_proizvoda' => 'string',
];
}
public function validationMessages()
{
return [
'datum_transakcije.string' => 'Ne postoji autorizacija',
'nosilac_kartice.string' => 'Ne postoji vozilo',
'naziv_proizvoda.string' => 'Ne postoji tip goriva',
];
}
}
Все отлично работает, и я получаю сообщения в блейд-файле, но я хотел бы предоставить дополнительную информациюо строке, что проверка не пройдена