Проверка импорта CSV для Laravel постоянно проверяет значение как отсутствующее - PullRequest
0 голосов
/ 08 июля 2020

Я использую Laravel проверку строки maatwebsite 3.1.3 для проверки импорта файла csv. Но проблема WithValidation в моем файле Imports php постоянно выдает ошибку о том, что требуется последнее значение второй строки импорта, даже если это значение присутствует. Когда я удаляю проверку, импорт работает нормально.

Мой контроллер вызывает функцию импорта:

public function doImport(Request $request) {
        $this->validate($request, [
            'import_file' => 'required|mimes:xls,csv,xlsx,txt' // txt is needed for csv mime type validation
        ]);
        if($request->file('import_file')) {
        try {
            Excel::import(new FPImport, $request->file('import_file'));
            return redirect('admin/fertil/products')->with('success', 'Invoer Sukses');
        } catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
                $msg = '';
                $failures = $e->failures();
                foreach ($failures as $failure) {
                    $msg = 'Ry '.$failure->row(); // row that went wrong
                    $msg = $msg.' vir hoof '.$failure->attribute(); // either heading key (if using heading row concern) or column index
                    $msg = $msg.'. '.$failure->errors()[0]; // Actual error messages from Laravel validator
                    // $msg = $msg.' : met waarde '.$failure->values(); // The values of the row that has failed: not available in version
                }
                return back()->with('error', $msg);
            }
        }

        return back()->with('error', 'Lêer nie gevind nie');
     }

Мой класс импорта:

class FPImport implements ToModel, WithValidation, WithStartRow
{ 
    public function startRow(): int
    {
        return 2;
    }
    public function model(array $row)
    {   
        return new FertilProd([
            //
            'register_no'=> $row[0],
            'product_type'=> $row[1], // id of prodtype tb
            'formulation_type'=> $row[2],  // id of formulation type tb
            'description'=> $row[3],
            'formulation_metric'=> $row[4], // id of formulation metric tb
            'SAP_no'=> $row[5],
            'N'=> $row[6],
            'P'=> $row[7],
            'K'=> $row[8],
            'Zn'=> $row[9],
            'Ca'=> $row[10],
            'Mg'=> $row[11],
            'S'=> $row[12],
            'B'=> $row[13],
            'Cu'=> $row[14],
            'Fe'=> $row[15],
            'Mn'=> $row[16],
            'Mo'=> $row[17],
            'Ni'=> $row[18],
            'Se'=> $row[19],
            'SG'=> $row[20],
        ]);
    }
    public function rules(): array
    {
        return [
            'register_no' => 'required|string',
            'product_type' => 'required|integer|min:1',            //validate unsigned integer
            'formulation_type' => 'required|integer|min:1',
            'description'=> 'required|string',
            'formulation_metric'=> 'required|integer|min:1',
            'SAP_no'=> 'required|string', 
            'N' => 'required|numeric|between:0,99.9999',
            'P' => 'required|numeric|between:0,99.9999',
            'K' => 'required|numeric|between:0,99.9999',
            'Zn' => 'required|numeric|between:0,99.9999',
            'Ca' => 'required|numeric|between:0,99.9999',
            'Mg' => 'required|numeric|between:0,99.9999',
            'S' => 'required|numeric|between:0,99.9999',
            'B' => 'required|numeric|between:0,99.9999',
            'Cu' => 'required|numeric|between:0,99.9999',
            'Fe' => 'required|numeric|between:0,99.9999',
            'Mn' => 'required|numeric|between:0,99.9999',
            'Mo' => 'required|numeric|between:0,99.9999',
            'Ni' => 'required|numeric|between:0,99.9999',
            'Se' => 'required|numeric|between:0,99.9999',
            'SG' => 'required|numeric|between:0,99.9999',
        ];
    }
    public function customValidationMessages()
    {
        return [
            'register_no' => 'Registrasie kolom moet letter waarde wees',
            'product_type' => 'Tipe produk kolom moet volgetal wees',
            'product_type' => 'Formulasie tipe kolom moet volgetal wees',
            'description'=> 'Beskrywing kolom moet letter waarde wees',
            'formulation_metric'=> 'Formulasie mate kolom moet volgetal wees',
            'SAP_no'=> 'SAP no kolom moet letter waarde wees', 
            'N' => 'N kolom moet waarde wees tussen 0,99.9999',
            'P' => 'P kolom moet waarde wees tussen 0,99.9999',
            'K' => 'K kolom moet waarde wees tussen 0,99.9999',
            'Zn' => 'Zn kolom moet waarde wees tussen 0,99.9999',
            'Ca' => 'Ca kolom moet waarde wees tussen 0,99.9999',
            'Mg' => 'Mg kolom moet waarde wees tussen 0,99.9999',
            'S' => 'S kolom moet waarde wees tussen 0,99.9999',
            'B' => 'B kolom moet waarde wees tussen 0,99.9999',
            'Cu' => 'Cu kolom moet waarde wees tussen 0,99.9999',
            'Fe' => 'Fe kolom moet waarde wees tussen 0,99.9999',
            'Mn' => 'Mn kolom moet waarde wees tussen 0,99.9999',
            'Mo' => 'Mo kolom moet waarde wees tussen 0,99.9999',
            'Ni' => 'Ni kolom moet waarde wees tussen 0,99.9999',
            'Se' => 'Se kolom moet waarde wees tussen 0,99.9999',
            'SG' => 'SG kolom moet waarde wees tussen 0,99.9999',
        ];
    }
}

Обновление Итак, я получил его для импорта, используя проблему ToCollection. Но сейчас он не проверяет строки. Как я тестировал, помещая строки там, где должны быть целые числа, и он все еще пытался импортировать. Я получил сообщение об ошибке от обработчика ошибок SQL.

Другое обновление: Итак, я вернулся к использованию проблемы ToModel, поскольку Collection не проверил csv. Я также заметил, что я не объявил пакет use Illuminate\Validation\Rule; в моем файле импорта. Это не решило проблему после объявления. Я изменил ссылку на переменную в функции rules() на индексы строк, а затем строка за строкой была проверена. Но теперь он застрял с сообщением об ошибке, что 0 field of row 14 is required. Первая ячейка в первом столбце 14-й строки заполнена, поэтому сообщение failure->error()[0] должно отсутствовать.

Может ли кто-нибудь помочь мне понять, почему правило для импорта постоянно говорит, что поле требуется даже хоть он присутствует?

1 Ответ

0 голосов
/ 09 июля 2020

Я решил свой ответ. Последнее обновление в моем вопросе было правильным ответом. Было нулевое значение, которое означало, что это необходимо. Хотя нулевое значение находилось в другой строке, как 14. Причина неправильной строки в том, что foreach l oop в объекте массива failures вернет только последнюю строку после проверки.

Во-первых, я должен был объявить пакет: use Illuminate\Validation\Rule; в моем файле импорта.

Во-вторых, я должен использовать индекс строк в качестве переменной для моих правил в моей функции rules(), а не модели $fillable объявленные имена, например:

   /**
    * @return array
    */
    public function rules(): array
    {
        return [ // use indexes as variables
            '0' => 'required|string',
            '1' => 'required|integer|min:1',            //validate unsigned integer
            '2' => 'required|integer|min:1',
            '3'=> 'required|string',
            '4'=> 'required|integer|min:1',
            '5'=> 'required|string', 
            '6' => 'required|numeric|between:0,99.9999',
            '7' => 'required|numeric|between:0,99.9999',
            '8' => 'required|numeric|between:0,99.9999',
            '9' => 'required|numeric|between:0,99.9999',
            '10' => 'required|numeric|between:0,99.9999',
            '11' => 'required|numeric|between:0,99.9999',
            '12' => 'required|numeric|between:0,99.9999',
            '13' => 'required|numeric|between:0,99.9999',
            '14' => 'required|numeric|between:0,99.9999',
            '15' => 'required|numeric|between:0,99.9999',
            '16' => 'required|numeric|between:0,99.9999',
            '17' => 'required|numeric|between:0,99.9999',
            '18' => 'required|numeric|between:0,99.9999',
            '19' => 'required|numeric|between:0,99.9999',
            '20' => 'required|numeric|between:0,99.9999',
        ];
    }

Теперь он импортирует и проверяет. Однако мне не удалось заставить работать настраиваемые сообщения проверки.

...