Laravel Import Large Excel Data

Alfajri
3 min readAug 6, 2024

--

Photo by Mohammad Rahmani on Unsplash

Kali ini kita akan membahas salah satu fitur yang banyak digunakan dalam suatu aplikasi yaitu Import Data. Meskipun laravel sudah mempunyai fitur Import namun pada kenyataannya ada beberapa masalah saat implementasinya, salah satunya ialah jumlah data yang diimport.

Semakin banyak jumlah data yang diimport maka akan semakin berat program dijalankan.

Sebagai contoh ketika saya mengimport 200 data, proses import membutuhkan waktu lebih dari 60 detik yang membuat aplikasi error menjadi Maximum Time Proccess Extended.

Fokus dari tulisan kali ini adalah konsep dari fitur import dari Laravel. Laravel menggunakan library maatwebsite/excel untuk dapat menjalankan fitur ini. Kamu dapat menginstallnya lewat dokumentasi resminya Install Maatwebsite

Basic code dari import data pada Laravel adalah

namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;

class UsersImport implements ToModel
{
#1
public function model(array $row)
{
dd($row);
// Berisi data baris pertama yang ada didalam excel
return new User([
'name' => $row[0],
]);
}

` #2
public function collection(Collection $rows)
{
dd($row);
// Berisi semua data yang ada didalam excel
foreach ($rows as $row)
{
User::create([
'name' => $row[0],
]);
}
}
}

ToModel akan mengambil setiap baris yang ada pada file excel, jadi jika ada 100 data yang ada maka akan looping 100x mengeksekusi code model tersebut.

ToCollection akan mengambil semua data pada excel, dengan ToCollection kamu hanya perlu melakukan looping data $rows untuk dimasukkan pada model User.

Kedua cara diatas sama-sama akan melakukan looping sebanyak data yang ada pada excel, dan itu akan menjadi msalah jika data yang ada sangat banyak. Untuk mengatasinya kamu dapat menggunakan Batch inserts.

Batch inserts

namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithBatchInserts;

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

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

Salah satu cara untuk dapat mengatsinya ialah menggunakan Batch inserts, metode ini bekerja dengan cara melakukan bulk insert pada jumlah data tertentu.

public function batchSize(): int {
return 10; // data akan dimasukkan per 10 data
}

Misalkan terdapat 100 data dengan batchSize 10, maka data akan diinputkan pada model sebanyak 10 data secara bersamaan.

Batchsize tidak berfungsi jika menggunakan fungsi ToCollection

Tanpa batch insert, sql yang terjadi ialah seperti dibawah dan diloop sebanyak 100x

INSERT INTO users (id, name, email, username, password, is_teacher, created_at, updated_at)
VALUES (1, 'John Doe', 'johndoe@example.com', 'johndoe', '$2y$12$Q9mVZlGKlI7C9jboIqj6Je0bE/uBygLZ2gqZDL8JhEX8q7thVZk1e', 0, NOW(), NOW());

Sedangkan dengan batch insert sql yang dieksekusi ialah seperti dibawah dan diloop sebanyak 10x saja

INSERT INTO users (name, email, username, password, is_teacher, created_at, updated_at) VALUES
('John Doe', 'johndoe@example.com', 'johndoe', '$2y$12$Q9mVZlGKlI7C9jboIqj6Je0bE/uBygLZ2gqZDL8JhEX8q7thVZk1e', 0, NOW(), NOW()),
....,
....,
....,
('Ivy Green', 'ivygreen@example.com', 'ivygreen', '$2y$12$Q9mVZlGKlI7C9jboIqj6Je0bE/uBygLZ2gqZDL8JhEX8q7thVZk1e', 1, NOW(), NOW());

Karena hanya mengeksekusi 10 code sql, maka program tidak akan atau setidaknya mengurangi program Maximum Time Proccess Extended.

Catatan

Perlu diketahui bahwa jika terdapat 2 aksi pada 1 data kamu tidak akan bisa menggunakan teknik batch insert ini, contohnya jika kamu menggunakan role permission dengan spatie pada data User.

Setelah User dibuat user harus di ->assignRole($role) agar masuk kedalam role tertentu, Hal semacam ini tidak bisa diterapkan menggunakan ToModel dan Batch Insert karena data akan dibundle menjadi beberapa batch sedangkan fungsi seperti assignRole harus dilakukan 1 per 1 pada setiap data.

Terima kasih

--

--

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