Import With Relationships Using Laravel Excel

Import With Relationships Using Laravel Excel

Pendahuluan

Migrasi aplikasi ke dalam sistem yang baru, terkadang ada banyak perbedaan yang cukup signifikan, salah satu diantaranya adalah struktur database antara sistem yang lama dengan sistem yang baru. Misalnya saja pada case yang sedang saya alami, pada sistem yang baru, relasi antara user dan objek_pajak menggunakan user_id sebagai foreign key, sedangkan pada sistem yang lama, nik digunakan sebagai foreign key-nya.

Proses yang akan kita kerjakan adalah melakukan migrasi dengan penyesuaian sesuai dengan struktur database yang baru. Berikut adalah beberapa gambaran dari proses yang akan kita kerjakan.

  1. Struktur database

    Struktur Database

  2. Database dari sistem yang lama dengan format CSV

    CSV Format

Adapun format CSV-nya bisa Anda download disini.

Baca Juga: Support For Password Authentication Was Removed On Github

Import Relationships Using Laravel Excel

Saya berasumsi bahwa teman-teman telah menyediakan atau memiliki struktur table yang sama seperti gambar di atas, maka hal pertama yang akan kita kerjakan adalah meng-install Laravel Excel 3.1 dengan command

composer require maatwebsite/excel

Kemudian generate class baru untuk meng-handle proses import data dengan command

php artisan make:import ObjekPajakImport

Buka file app/Imports/ObjekPajakImport.php dan modifikasi menjadi

<?php

namespace App\Imports;

use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\Importable;
use App\Models\ObjekPajak;
use App\Models\User;

//KITA GUNAKAN toModel KARENA PROSES QUERYNYA VIA ELOQUENT
//WithHeadingRow KARENA STRUKTUR YANG ADA PADA FILE CSV TERDAPAT HEADER
class ObjekPajakImport implements ToModel, WithHeadingRow
{
    use Importable;
    
    protected $users;
    public function __construct()
    {
        //QUERY UNTUK MENGAMBIL SELURUH DATA USER
        $this->users = User::select('id', 'nik')->get();
    }

    public function model(array $row)
    {
        //KEMUDIAN KITA FILTER MELALUI COLLECTION AGAR TIDAK BANYAK QUERY YANG DIJALANKAN
        //DATA YANG DICARI ADALAH DATA USER BERDASARKAN NIK KARENA YANG MENJADI FOREIGN KEY PADA SISTEM YANG LAMA ADALAH NIK DAN SISTEM BARU ADALAH ID, MAKA KEDUA DATA INI AKAN KITA KONVERSI
        $user = $this->users->where('nik', $row['nik'])->first();
        return new ObjekPajak([
            'user_id' => $user->id ?? NULL,
            'nopd' => $row['nopd'],
            'nama_usaha' => $row['nama_usaha'],
            'alamat' => $row['alamat'],
            'rt_rw' => $row['rt_rw'],
            'status' => $row['status']
        ]);
    }
}

Oleh karena fitur ini adalah sekali pakai, yakni di awal proses migrasi, maka fungsi di atas akan kita jalan di seeder. Generate seeder baru dengan command

php artisan make:seeder ObjekPajakImportSeeder

Buka file database/seeders/ObjekPajakImportSeeder.php dan modifikasi menjadi

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Imports\ObjekPajakImport;

class ObjekPajakImportSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //IMPORT DATA DARI FILE CSV YANG DISIMPAN DI DALAM FOLDER DATABASE/SEEDERS
        (new ObjekPajakImport)->import(base_path('database/seeders/objek_pajak.csv'));
    }
}

Langkah terakhir adalah eksekusi seeder di atas dengan command

php artisan db:seed --class=ObjekPajakImportSeeder

Sehingga hasil yang akan kita peroleh akan terlihat seperti gambar berikut

Imported File Via CSV

Category:
Share:

Comments