Laravel RajaOngkir: Membuat Migration dan Seeder

ID • 2 years ago • 6 min read • 6464 views
Laravel RajaOngkir: Membuat Migration dan Seeder

Laravel RajaOngkir: Membuat Migration dan Seeder

id6 min read • 6464 views

RajaOngkir adalah salah satu platform yang menyediakan layanan informasi logistik, termasuk data provinsi dan kota di Indonesia. Dalam pengembangan aplikasi berbasis Laravel, seringkali kita memerlukan data tersebut untuk mempermudah pengguna dalam memilih lokasi pengiriman atau penerimaan barang.

Pada artikel ini, kita akan membahas cara menyimpan data provinsi dan kota dari RajaOngkir ke dalam database menggunakan Laravel. Proses ini memungkinkan kita untuk memiliki data tersebut secara lokal dan dapat diakses dengan mudah dari aplikasi yang sedang kita kembangkan.

Persiapan

Sebelum memulai, pastikan teman-tema memiliki beberapa hal berikut:

  1. Akun RajaOngkir: Daftarkan diri dan dapatkan API key dari RajaOngkir melalui situs resmi mereka (https://rajaongkir.com/).
  2. Instalasi Laravel: Pastikan teman-teman memiliki Laravel terinstal di sistem. Jika belum, Kalian dapat mengikuti panduan instalasi di situs resmi Laravel (https://laravel.com/docs/).

FYI. Di artikel ini, saya akan melanjutkan artikel sebelumnnya yang telah membahas bagimana cara register akun dan mendapatkan API Key RajaOngkir. Jika teman-teman belum mengikutinya, saya sarankan untuk mengikuti series Laravel RajaOngkir.

Step 1: Generate Model, Migration & Seeder

Oke, kita akan membuat tabel-tabel yang diperlukan untuk menyimpan data provinsi dan kota. Laravel menyediakan fitur migration untuk mengelola struktur database dan seeder untuk insert data ke tabel database. Buka terminal atau command prompt, dan jalankan perintah berikut:

php artisan make:model Province -ms
php artisan make:model City -ms

Langkah di atas akan membuat 6 file yang terdiri dari; 2 file model di dalam direktori app/models, 2 file migration di dalam direktori database/migrations dan 2 file seeder di dalam direktori database/seeders

Step 2: Setup Migration

Berikutnya, mari kita lakukan konfigurasi pada 2 file migration yang telah kita generate. File migration yang pertama adalah file migration province. Silakan buka file tersebut di database/migrations/{timestamp}_create_provinces_table.php, kemudian edit method up menjadi seperti di bawah ini. Kita hanya memerlukan column name di tabel provinces.

public function up(): void
{
    Schema::create('provinces', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}

Selanjutnya buka file database/migrations/{timestamp}_create_cities_table.php, dan edit method up menjadi seperti di bawah ini. Di tabel cities, kita akan menambahkan column; province_id, type, name dan postal_code.

public function up(): void
{
    Schema::create('cities', function (Blueprint $table) {
        $table->id();
        $table->foreignId('province_id');
        $table->string('type');
        $table->string('name');
        $table->string('postal_code');
        $table->timestamps();
    });
}

Step 3: Setup Seeder

Selesai di migration, sekarang beralih ke file seeder. Seeder pertama yang akan kita setup adalah ProvinceSeeder. Silakan buka file database/seeders/ProvinceSeeder.php dan edit menjadi seperti di bawah ini.

<?php

namespace Database\Seeders;

use App\Models\Province;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Http;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class ProvinceSeeder extends Seeder
{
    public function run(): void
    {
        $provinces = Http::withOptions(['verify' => false,])->withHeaders([
            'key' => env('RAJAONGKIR_API_KEY')
        ])->get('https://api.rajaongkir.com/starter/province')->json()['rajaongkir']['results'];

        foreach ($provinces as $province) {
            Province::create([
                'name'        => $province['province'],
                'created_at'  => now(),
                'updated_at'  => now(),
            ]);
        }
    }
}

Seeder yang kedua adalah CitySeeder. Silakan buka file seeder tersebut di database/seeders/ProvinceSeeder.php dan update menjadi seperti di bawah ini.

<?php

namespace Database\Seeders;

use App\Models\City;
use App\Models\Province;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Http;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class CitySeeder extends Seeder
{
    public function run(): void
    {
        $provinces = Province::all();

        foreach ($provinces as $province) {
            $cities = Http::withOptions(['verify' => false,])->withHeaders([
                'key' => env('RAJAONGKIR_API_KEY')
            ])->get('https://api.rajaongkir.com/starter/city?province=' . $province->id)->json()['rajaongkir']['results'];

            $insert_city = [];

            foreach ($cities as $city) {

                $data = [
                    'province_id'   => $province->id,
                    'type'          => $city['type'],
                    'name'          => $city['type'] . ' ' . $city['city_name'],
                    'postal_code'   => $city['postal_code'],
                    'created_at'    => now(),
                    'updated_at'    => now(),
                ];

                $insert_city[] = $data;
            }

            $insert_city = collect($insert_city);

            $city_chunks = $insert_city->chunk(100);

            foreach ($city_chunks as $chunk) {
                City::insert($chunk->toArray());
            }
        }
    }
}

Selanjutnya, kita panggil kedua seeder tersebut pada class DatabaseSeeder seperti di bawah ini:

public function run(): void
{
    $this->call([
        ProvinceSeeder::class,
        CitySeeder::class,
    ]);
}

Step 4: Setup Model

Sebelum kita menjalankan migrate & seed, mari kita setup kedua model Province dan City terlebih dahulu dengan menambahkan relasi antara kedua model tersebut. Model yang pertama ada Province. Silakan buka file model Province dan tambahkan relasi hasMany dengan model City seperti di bawah ini.

use Illuminate\Database\Eloquent\Relations\HasMany;
....
....
protected $guarded = [];

public function cities(): HasMany
{
    return $this->hasMany(City::class);
}

Kemudian, buka file model City dan tambahkan relasi belongsTo dengan model Province seperti di bawah ini.

use Illuminate\Database\Eloquent\Relations\BelongsTo;
....
....
protected $guarded = [];

public function province(): BelongsTo
{
    return $this->belongsTo(Province::class);
}

Step 5: Migrate & Seed

Wokey, jika migration, model dan seeder telah selesai kita konfigurasi, sekarang kita bisa menjalankan perintah php artisan migrate --seed untuk memigrasi file-file migration ke database dan menjalankan perintah seeder.

php artisan migrate --seed

Setelah proses migrate & seed selesai, sekarang kalau kita cek pada tabel provinces, maka akan berisi data provinsi-provinsi di Indonesia seperti gambar di bawah ini.

Get Indonesian Provinces

Dan di tabel cities akan terisi data kota-kota di Indonesia seperti gambar di bawah ini.

Get Indonesian Cities

Dalam artikel ini, kita telah mempelajari bagaimana menyimpan data provinsi dan kota dari RajaOngkir ke dalam database menggunakan Laravel. Proses ini akan memungkinkan kita untuk memiliki data lokasi secara lokal dan mempermudah user dalam memilih lokasi dengan mudah dari aplikasi yang sedang kita kembangkan. Semoga artikel ini bermanfaat dalam pengembangan proyek Laravel teman-teman yang menggunakan layanan logistik dari RajaOngkir. Selamat mencoba dan see you 👋

Source Code: Laravel Raja Ongkir

Series: Laravel RajaOngkir
Published on July 30, 2023
Last updated on June 04, 2026
Loading Comments

If you like this post and want to support us, you can support us via buymeacoffee or trakteer.