M
Mr Sugiarto
Developer
02 Sep 2026 2 min read

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.

Screenshot: Seeder berhasil generate 5 kategori dan 15 post lewat factory. 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.

M
Mr Sugiarto

Developer

Bagian dari Series: Laravel 13 Dasar — Belajar Fundamental Lewat Blog Sederhana
Lihat Series Lengkap