Insert data manual lewat Tinker satu-satu itu cepat melelahkan begitu kita butuh puluhan atau ratusan baris data untuk testing tampilan (pagination, search, dsb). Laravel punya solusi: factory untuk mendefinisikan "resep" data dummy, dan seeder untuk menjalankan resep itu.
Seeder berhasil generate 5 kategori dan 15 post lewat factory.
Membuat factory
php artisan make:factory CategoryFactory --model=Category
php artisan make:factory PostFactory --model=Post
CategoryFactory
public function definition(): array
{
$name = fake()->unique()->words(2, true);
return [
'name' => ucfirst($name),
'slug' => str($name)->slug(),
];
}
fake() adalah helper ke library Faker, yang bisa generate berbagai jenis data realistis: nama, alamat, kalimat acak, dsb. Di sini kita pakai words(2, true) untuk dapat dua kata acak sebagai nama kategori, lalu ubah jadi slug.
PostFactory dengan relasi
public function definition(): array
{
$title = fake()->unique()->sentence(6);
return [
'category_id' => Category::factory(),
'title' => $title,
'slug' => str($title)->slug(),
'body' => fake()->paragraphs(3, true),
];
}
Bagian menarik: 'category_id' => Category::factory(). Ini artinya setiap kali sebuah Post dibuat lewat factory, Laravel otomatis membuat satu Category baru untuk dihubungkan — tidak perlu kita buat kategori dulu secara manual.
Menghubungkan lewat DatabaseSeeder
public function run(): void
{
User::factory()->create([
'name' => 'Test User',
'email' => 'test@example.com',
]);
Category::factory(5)
->has(Post::factory(3))
->create();
}
Category::factory(5)->has(Post::factory(3)) artinya: buat 5 kategori, dan untuk setiap kategori itu, buat 3 post yang terhubung ke kategori tersebut. Total: 5 kategori + 15 post, semuanya dengan relasi yang sudah benar dari awal.
Menjalankan seeder
php artisan migrate:fresh --seed
migrate:fresh menghapus semua tabel dan bikin ulang dari nol (hati-hati, ini menghapus semua data!), lalu --seed otomatis menjalankan DatabaseSeeder setelahnya.
Verifikasi lewat Tinker
App\Models\Category::count(); // 5
App\Models\Post::count(); // 15
App\Models\Post::first()->category->name; // nama kategori random
Kapan pakai seeder vs factory langsung?
- Factory — dipakai kapan pun kamu butuh data dummy, baik lewat seeder, testing otomatis (PHPUnit/Pest), atau Tinker
- Seeder — "resep gabungan" yang mendefinisikan skenario data awal untuk development, biasanya dijalankan sekali di awal setup project
Kombinasi keduanya jauh lebih maintainable dibanding insert manual, dan jadi standar de-facto di hampir semua project Laravel.
Selanjutnya
Data dummy sudah siap. Sekarang kita mulai bangun fitur utama: menampilkan daftar post dan detail post di halaman sungguhan.