Error Import pada Maatwebsite

Alfajri
3 min readSep 28, 2024

--

Photo by Rubaitul Azad on Unsplash

Maatwebsite pastinya sangat memudahkan bagi programmer khususnya dengan Laravel, dia menyediakan paket komplit agar kita dapat export maupun import dokumen format excel dengan sangat mudah.

Selama menggunakan library ini saya juga sering mengalami error maupun kendala saat import maupun export dokumen. Disini saya coba membangikan error yang kadang saya temui agar bisa menjadi catatan dikemudian hari jika menemui error yang sama.

Maximum Time Extended

Saat mengimport sebuah dokumen yang memiliki record yang banyak kadang saya menemui error tersebut, error tersebut terjadi karena data yang diproses terlalu banyak dan memerlukan waktu diatas 60 detik yang mengakibatkan waktu eksekusi terlalu lama.

Hal tersebut dapat diatasi dengan Batch inserts, metode ini mengubah query yang semula satu satu memasukkan data menjadi [batchSize] bulk insert.

class UsersImport implements ToModel, WithBatchInserts
{
public function model(array $row)
{
return new User([
'name' => $row[0],
]);
}

public function batchSize(): int
{
return 1000;
}
}

Misalkan kita memiliki 20 data, tanpa batch insert maka code akan mengeksekusi sql secara 1 per 1

INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);

INSERT INTO table_name (column4, column5, column6)
VALUES (value4, value5, value6);

INSERT INTO table_name (column7, column8, column9)
VALUES (value7, value8, value9);

20x sql

Jika diubah menjadi bulk insert hanya sekali eksekusi sql

INSERT INTO table_name (column1, column2, column3) 
VALUES
(value1, value2, value3),
(value4, value5, value6),
(value7, value8, value9);

Dengan metode ini dapat mengurangi waktu eksekusi, namun jika dalam program kamu memerlukan 2 aksi ketika import data maka tidak bisa.

$user = User::create([ …. ]);
$user->assigtRole(‘siswa’)

Misalkan setelah insert data lalu assign role maka tidak akan bisa dengan batchSize karena data dikelompokan bersama-sama lalu dimasukkan sekaligus.

Column is Required padahal sudah diisi

Ada sedikit bug atau kesalahan baca pada saat membaca file excel, data yang sudah yang dihapus tetap terbaca ada.

Misalkan kamu akan mengimport data excel seperti dibawah ini, dengan jumlah data 4 dan kolom nama required.

sebelum

Lalu kamu menghapus data dafa dan dian sebelum melakukan import, seperti gambar dibawah ini

sesudah dihapus

Pada saat import kamu akan menemukan error

Nama must be required on line 6

Terlihat error diatas mengatakan kolom nama harus diisi pada kolom 6, padahal tidak ada data pada line 6 ( data dafa dan dian ). Maatwebsite entah mengapa membaca jumlah data tetap 4 (sampai line 7).

Untuk mengatasi hal tersebut kita perlu menambahkan SkipsEmptyRows

class UsersImport implements ToModel, SkipsEmptyRows, WithHeadingRow, WithValidation
{
}

SkipEmptyRows berguna jika ada row yang kosong maka tidak akan diproses ( termasuk validasi ).

Multiplesheet Import

Ketika kamu memiliki file excel yang memiliki 2 sheet maka kemungkinan besar kamu akan menemui error dibagian validasi karena validasi dibagian Import digunakan untuk kedua sheet.

Misal sheet 1 memiliki 5 kolom required dan sheet 2 hanya memiliki 2 kolom, maka akan muncul error kolom 3 is required. Karena sheet 2 tidak memiliki data kolom 3.

Untuk mengatasi hal ini kamu perlu membuat file import 1 lagi yang berisi handle spesifik sheet

class ImportUserAll implements WithMultipleSheets
{

use Importable;

public function sheets(): array
{
return [
new ImportUser() // Handle sheet 1
];
}
}

File diatas dipanggil di controller dengan Implements WithMultipleSheets, fungsi sheet berisi file yang akan menghandle tiap sheet yang ada didalam file Excel. Dalam contoh diatas ImportUser akan menghandle sheet 1.

Jika ada 2 sheet dan dalam fungsi sheet hanya memiliki 1 file handle maka sheet kedua tidak akan diimport.

--

--

Alfajri
Alfajri

Written by Alfajri

Halo saya feri, tertarik pada teknologi dan seni. Ingin berbagi cerita dan pengalaman serta mencoba belajar menulis

No responses yet