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.
-
Struktur database
-
Database dari sistem yang lama dengan format CSV
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
Comments