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
php artisan make:seeder PostSeederFile: database/seeders/PostSeeder.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:
php artisan db:seed --class=PostSeederContoh 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
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:
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:
// 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:
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$fillabledi model (dibahas di modul mass-assignment), kalau tidak akan errorMassAssignmentException. Kalau seeder-mu error misterius, cek$fillabledulu 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.