Belajar Laravel 13 #4: Database Migration dan Seeding

Heru Iryanto
Heru Iryanto
Teacher, Content Creator and Full-Stack Developer

Di dunia amatir, jika disuruh membuat tabel artikel di Database, seorang Programmer akan membuka browser, mengetik localhost/phpmyadmin, mengeklik tombol ‘New Table’, dan memasukkan kolom id, judul, secara manual satu per satu.

Bagaimana jika proyek tersebut digarap oleh 5 Programmer yang berbeda komputernya? Apakah mereka berlima harus melakukan “Klik-Klik” manual yang sama di phpMyAdmin mereka masing-masing? Jawabannya Tidak! Insinyur menggunakan Migrations.

1️⃣ Migrations: Cetak Biru (Blueprint) Database

Migration adalah sistem kendali versi (seperti Git) namun khusus untuk Database. Kita mendeskripsikan kerangka bentuk tabel langsung di dalam file PHP. Jika file ini dijalankan, Laravel akan otomatis menjebol MySQL/TablePlus Anda, lalu menciptakan tabelnya di sana!

Mari membuat tabel artikel:

  1. Buka Terminal, panggil pembantu (Artisan):

    php artisan make:migration create_artikels_table
    

    Untuk nama table harus menggunakan huruf kecil dan ditambahkan akhiran ’s’. Contoh: posts, users, products, artikels, kategoris, dll. Jika tidak menggunakan akhiran ’s’, Laravel akan mengembalikkan error “Table artikels does not exist”.

    Kalau tabel nya sudah berakhiran ’s’ bagaimana ? Contohnya tabel penulis. Untuk mengatasi error, biasanya kita menambahkan protected $table = 'penulis'; di model Penulis, maka nanti laravel tidak akan mencari tabel penuliss tapi penulis.

  2. Setelah perintah diatas dijalankan, Laravel akan otomatis menciptakan sebuah file dengan penanda jam (contoh: 2026_07_19_create_artikels_table.php) di dalam folder database/migrations/.

  3. Buka file tersebut, Anda akan melihat sebuah default file migration. Ketikkan kerangka cetak biru tabel Anda seperti ini (tambahkan judul dan isi_berita):

    // Isi file Migration
    public function up(): void
    {
        // Memerintahkan Schema untuk membuat tabel baru 'artikels'
        Schema::create('artikels', function (Blueprint $table) {
    
            // $table->tipeData('nama_kolom')
            $table->id(); // Membuat kolom ID otomatis (Primary Key)
            $table->string('judul', 150); // Kolom Teks Pendek (Maks 150 Karakter)
            $table->text('isi_berita'); // Kolom Teks Panjang tak terbatas
    
            // PENTING: Timestamp otomatis membuat kolom 'created_at' dan 'updated_at'
            $table->timestamps(); 
        });
    }
    

    Tipe data yang sering digunakan:

    • id(): Kolom ID otomatis (Primary Key)
    • string('nama_kolom', 150): Kolom Teks Pendek (Maks 150 Karakter)
    • text('nama_kolom'): Kolom Teks Panjang tak terbatas
    • integer('nama_kolom'): Kolom Angka Bulat
    • decimal('nama_kolom', 10, 2): Kolom Angka Desimal (10 digit total, 2 digit desimal)
    • boolean('nama_kolom'): Kolom Boolean (True/False)
    • date('nama_kolom'): Kolom Tanggal
    • datetime('nama_kolom'): Kolom Tanggal dan Waktu
    • timestamps(): Kolom Timestamp otomatis (created_at dan updated_at)

    Kalau suatu saat kita membuat id nya tidak otomatis, misal $table->id('nisn'); bagaimana ? Maka kolom nisn akan otomatis dibuat menjadi primary key. Namun di model nya kita harus memberi tahu laravel bahwa kolom id nya bukan id tapi nisn dengan cara : protected $primaryKey = 'nisn'; di dalam modelnya.

  4. Sekarang mari kita eksekusi Cetak Biru tersebut. Aktifkan Server Laragon Anda terlebih dahulu, lalu di Terminal ketikkan perintah berikut:

    php artisan migrate
    
  5. Seketika, Laravel akan memproduksi tabel artikels tersebut ke dalam Database ‘TablePlus’ Anda, silakan cek TablePlus Anda.

Jika Anda bekerja dalam sebuah tim, cukup copy paste file migration tersebut ke komputer teman Anda (bisa via git atau lainnya). Teman Anda di komputer lain cukup mengetik perintah yang sama yaitu php artisan migrate dan Database-nya akan sama persis dengan milik Anda tanpa perlu file ekspor .sql jelek!

2️⃣ Fitur Pembatalan (Rollback)

Oh, bos Anda bilang bahwa kolom isi_berita itu salah nama? Harusnya konten? Jangan hapus manual di TablePlus! Di file yang sama, ada fungsi down(). Fungsi ini berguna sebagai tombol Undo (Batal).

Ketik di terminal:

php artisan migrate:rollback

Seketika, tabel artikels akan hilang dilenyapkan. Anda bebas memperbaiki filenya, lalu merajutnya (migrate) kembali dengan perintah php artisan migrate atau php artisan migrate:refresh (menghapus tabel yang sudah ada dan membuat ulang) setelah kamu merubah isi_berita menjadi konten di dalam function up.

php artisan migrate

3️⃣ Seeding: Menyuntik Data Palsu Secara Gaib

Tabel artikels Anda sudah jadi, tapi masih kosong. Bagaimana cara menampilkannya ke desain Front-End Tailwind Anda jika isinya belum ada? Mengisi manual 50 data Insert sangat melelahkan. Gunakan Seeder & Factory.

Laravel memiliki perpustakaan robot bernama Faker yang ahli mengarang bebas bahasa manusia (mengarang nama, alamat, paragraf, dsb).

  1. Buat model Artikel terlebih dahulu sebelum membuat seeder:

    php artisan make:model Artikel
    

    Model adalah avatar atau perwakilan dari sebuah tabel di database.

    Perintah diatas akan membuat sebuah file model artikel (Artikel.php) di dalam folder app/Models/.

    Biasakan untuk nama model diawali dengan huruf besar, seperti User, Post, Comment agar lebih mudah dikenali dan beda dari nama tabel.

    Buka file app/Models/Artikel.php dan edit menjadi seperti ini:

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    
    class Artikel extends Model
    {
        use HasFactory;
    
        // Tambahkan baris ini di bawah()
        protected $fillable = [
            'judul', 
            'konten'
        ];
    }
    

    Penjelasan:

    • use Illuminate\Database\Eloquent\Factories\HasFactory; adalah baris yang wajib ada untuk mengaktifkan fitur pabrik (factory). Kemudian nanti dipanggil dengan use HasFactory; di bawah class Article.
    • protected $fillable berfungsi untuk memberitahu Laravel kolom mana saja di tabel artikels yang boleh diisi datanya via program. Jika Anda tidak menulis ini, Laravel akan menolak menyimpan data (mengembalikan error MassAssignmentException) demi keamanan. Meskipun terkadang jika dengan seeder dan kamu tidak menuliskan protected $fillable pun tidak apa-apa, namun sangat tidak dianjurkan dan berisiko tinggi bagi keamanan aplikasi anda di masa mendatang.
  2. Buat Pabrik Data:

    php artisan make:factory ArtikelFactory
    
  3. Perintah diatas akan membuatkan sebuah file baru. Buka filenya di database/factories/ArtikelFactory.php, lalu perbaiki menjadi seperti ini untuk bagian definition():

    public function definition(): array
    {
        // Suruh robot Faker mengarang data acak!
        return [
            'judul' => fake()->sentence(5), // Karang kalimat judul 5 kata
            'konten' => fake()->paragraphs(3, true), // Karang 3 paragraf panjang
        ];
    }
    

    True adalah nilai boolean (benar) yang akan memberi perintah pada faker untuk membuat paragrafnya menjadi lebih panjang (sesuai dengan panjang artikel pada umumnya). Kalau tidak menggunakan true, maka paragrafnya akan sangat pendek (sekitar 2 kalimat saja).

  4. Buka file komando database/seeders/DatabaseSeeder.php dan beritahu mesin untuk mereplikasinya 20 kali lipat:

    // Mencetak 20 Artikel bohong dengan kecepatan cahaya!
    \App\Models\Artikel::factory(20)->create();
    

    Atau jika kamu mau penulisannya lebih sederhana, cukup tulis seperti ini:

    use App\Models\Artikel;
    // ...
    
    // 20 data palsu
    Artikel::factory(20)->create();
    

    Perintah diatas akan menghasilkan 20 data artikel palsu yang sama dengan perintah sebelumnya.

    Jika ingin membuat 1 data saja secara manual, judul dan konten dibuat manual di seed. Kodingannya seperti ini:

    use App\Models\Artikel;
    // ...
    
    // 1 data
    Artikel::create([
        'judul' => 'Judul Artikel Manual',
        'konten' => 'Konten Artikel Manual',
    ]);
    

    Perbedaan tanda -> dan => adalah:

    • tanda -> digunakan untuk memanggil method (fungsi)
    • tanda => digunakan untuk membuat array (pasangan key dan value pada array).

    Kodingan Artikel::factory(20)->create() dalam materi sebelumnya bisa diartikan sebagai “Tolong akses “Artikel” lalu panggil “factory” lalu “buat” (Create) 20 data artikel sekaligus”.

  5. Eksekusi di Terminal:

    php artisan db:seed
    

Selesai! Buka TablePlus Anda, Anda memiliki 20 baris data artikel bahasa Latin acak yang siap digunakan untuk menguji desain website Anda!

🗽 Kesimpulan

Jika Anda telah menguasai migrate dan seed, Anda telah menghancurkan 20 jam kerja sia-sia (copy-paste data dummy manual) menjadi 5 detik. Inilah kekuatan skala penuh arsitektur korporat!

Namun, tabel Database murni hanyalah brankas kosong. Bagaimana cara sistem Laravel (Sang Pelayan) memanggil keduapuluh artikel tadi untuk dihidangkan ke Piring Blade HTML? Lupakan kodingan jadul SQL SELECT * FROM. Kita akan memanggil Jin Database (ORM) terhebat di dunia pada materi Keajaiban Eloquent ORM.