LaravelSeederDatabaseMenengah4 mnt baca

Seeder: Isi Database dengan Data Dummy

Buat data awal yang konsisten untuk development dan testing.

Kenapa Butuh Seeder?

Setiap kali kamu reset database saat development (migrate:fresh), semua data hilang. Lalu kamu harus membuat user admin manual, membuat kategori manual, membuat postingan contoh manual, berulang-ulang. Membosankan dan rawan lupa.

Seeder adalah skrip pengisi data awal yang bisa dijalankan ulang kapan pun. Sekali tulis, kamu bisa membangun ulang database development yang realistis hanya dengan satu perintah. Tim-mu pun dapat data awal yang sama persis, jadi bug "di laptopku tidak error" berkurang drastis.

Contoh 1: Seeder Sederhana

bash
php artisan make:seeder PostSeeder

File: database/seeders/PostSeeder.php

php
<?php

namespace Database\Seeders;

use App\Models\Post;
use Illuminate\Database\Seeder;

class PostSeeder extends Seeder
{
    public function run(): void
    {
        $posts = [
            ['title' => 'Belajar Laravel dari Nol', 'body' => 'Panduan langkah demi langkah...'],
            ['title' => 'Memahami Eloquent', 'body' => 'ORM yang manusiawi...'],
            ['title' => 'Blade untuk Pemula', 'body' => 'Template engine Laravel...'],
        ];

        foreach ($posts as $data) {
            Post::create($data);
        }
    }
}

Jalankan:

bash
php artisan db:seed --class=PostSeeder

Contoh 2: Mengatur Urutan dan Kombinasi Perintah

Seeder yang saling bergantung harus jalan berurutan (post butuh user dulu sebagai penulis). Daftarkan di DatabaseSeeder:

File: database/seeders/DatabaseSeeder.php

php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,   // jalan duluan: bikin admin + penulis
            CategorySeeder::class,
            PostSeeder::class,   // terakhir: butuh user & kategori
        ]);
    }
}

Perintah yang sering dipakai:

bash
php artisan db:seed                  # jalankan DatabaseSeeder
php artisan migrate:fresh --seed     # reset total + isi ulang (favorit saat dev)

Untuk ratusan data dummy yang realistis (bukan 3 postingan manual), gabungkan seeder dengan factory:

php
// di dalam PostSeeder::run()
Post::factory()->count(100)->create();

Jebakan Umum

1. Seeder tidak idempotent lalu dijalankan dua kali. Post::create() biasa akan membuat duplikat setiap kali db:seed dijalankan. Untuk data referensi (kategori, role), pakai firstOrCreate agar aman dijalankan berulang:

php
Category::firstOrCreate(['slug' => 'teknologi'], ['name' => 'Teknologi']);

2. Lupa mendaftarkan seeder baru di DatabaseSeeder. Kamu bikin CategorySeeder, menjalankannya manual dengan --class, lalu heran kenapa migrate:fresh --seed tidak mengisinya. Daftarkan di $this->call([...]) agar ikut jalan otomatis.

3. Menjalankan seeder development di production. Seeder berisi data dummy ("Test User", "asdf post") tidak boleh bocor ke production. Pisahkan dengan jelas: seeder data wajib (role admin awal) boleh jalan di production lewat proses deploy yang terkontrol, seeder dummy hanya untuk local/testing.

Catatan teknis: Post::create() butuh $fillable di model (dibahas di modul mass-assignment), kalau tidak akan error MassAssignmentException. Kalau seeder-mu error misterius, cek $fillable dulu sebelum menyalahkan seeder-nya.

Tantangan

Seed Kategori

Buat CategorySeeder yang mengisi 5 kategori (Teknologi, Kuliner, Travel, Olahraga, Musik). Daftarkan di DatabaseSeeder, jalankan db:seed, verifikasi jumlahnya via tinker.