Laravel

Panduan Lengkap Laravel Seeders dan Factories

06 Jun 2026 Administrator
Header Hero

Panduan Lengkap Laravel Seeders dan Factories

Manajemen Data Dummy Otomatis, Model States, Database Seeding, dan Faker API

Proses pengembangan dan pengujian (*testing*) aplikasi web memerlukan ketersediaan data yang realistis dalam jumlah besar. Mengisi data secara manual satu per satu ke dalam database melalui form HTML atau phpMyAdmin tidak hanya membuang waktu, tetapi juga tidak efisien untuk pengujian skala besar. Untuk mengatasi masalah ini, framework Laravel menyediakan kombinasi modul yang sangat kuat, yaitu Factories dan Seeders. Kedua fitur ini dirancang untuk mengotomatisasi pengisian data tiruan secara konsisten, aman, dan terstruktur sesuai skema Eloquent Model Anda.

Secara pembagian peran, **Factories** bertindak sebagai cetak biru (*blueprint*) yang bertugas menentukan bagaimana sebuah data dummy pada suatu model dikonstruksikan menggunakan pustaka Faker. Sementara itu, **Seeders** adalah instruksi eksekusi yang bertugas memasukkan data hasil komputasi *factories* tersebut ke dalam tabel database. Dengan memahami siklus kerja keduanya, Anda dapat dengan mudah mensimulasikan ratusan data pengguna, transaksi e-commerce, hingga relasi data yang rumit hanya dalam hitungan detik melalui terminal perintah Artisan.

Perbedaan Esensial: Gunakan Factories khusus untuk membuat data tiruan acak selama fase pengembangan atau testing unit. Gunakan Seeders tanpa factory jika Anda ingin memasukkan data statis produksi seperti daftar wilayah, pengaturan sistem, atau akun administrator default pertama.

1. Pembuatan dan Struktur Dasar Factories

Gunakan perintah bawaan Artisan untuk membuat berkas *factory* baru yang otomatis terhubung dengan Eloquent Model target Anda:

# Membuat factory dasar untuk model User
php artisan make:factory UserFactory --model=User

# Membuat beberapa factory sekaligus untuk relasi data
php artisan make:factory PostFactory --model=Post
php artisan make:factory CommentFactory --model=Comment

Buka file yang dihasilkan pada direktori database/factories/UserFactory.php. Di bawah ini adalah struktur standarisasinya:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * Tentukan status default bawaan dari model Anda.
     */
    public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => bcrypt('password123'), // Default enkripsi password
            'remember_token' => Str::random(10),
        ];
    }
}
Langkah 2

Manipulasi Data dengan Factory States

*States* memungkinkan Anda mendefinisikan variasi kondisi data tertentu tanpa harus merusak struktur utama method definition(). Anda bisa menambahkannya sebagai method kustom:

// Tambahkan method ini di dalam class UserFactory Anda

// Mengubah role menjadi administrator
public function admin(): static
{
    return $this->state(fn (array $attributes) => [
        'name' => 'Admin Utama SuryaSSH',
        'email' => '[email protected]',
        'role' => 'admin',
    ]);
}

// Menandai status user tidak aktif
public function inactive(): static
{
    return $this->state(fn (array $attributes) => [
        'active' => false,
        'email_verified_at' => null,
    ]);
}

Contoh cara memicu pemanggilan *states* tersebut di dalam kode pengujian atau seeder Anda:

// Membuat single admin user
$admin = User::factory()->admin()->create();

// Menggabungkan beberapa state sekaligus (Membikin 5 admin yang berstatus tidak aktif)
$disabledAdmins = User::factory()->count(5)->admin()->inactive()->create();
Langkah 3

Menangani Hubungan Relasi Model (Relationships)

Jika sebuah model membutuhkan ID dari model lain (misalnya data Post milik User), Anda dapat langsung mendaftarkan cetak biru factory induk ke dalam array definisi:

// database/factories/PostFactory.php
public function definition(): array
{
    return [
        'title' => fake()->sentence(),
        'content' => fake()->paragraph(5),
        // Otomatis men-generate data User baru dan mengambil id-nya saat Post dibuat
        'user_id' => \App\Models\User::factory(), 
    ];
}

2. Implementasi Sistem Database Seeders

Gunakan Artisan untuk membuat berkas *seeder* penampung eksekusi data:

php artisan make:seeder UserSeeder

Buka file database/seeders/UserSeeder.php. Di bawah ini adalah contoh nyata bagaimana Anda mengombinasikan data manual produksi dengan data massal berbasis *factories*:

<?php

namespace Database\Seeders;

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

class UserSeeder extends Seeder
{
    public function run(): void
    {
        // 1. Contoh Memasukkan Data Manual Untuk Akun Utama Produksi
        User::create([
            'name' => 'Super Administrator',
            'email' => '[email protected]',
            'password' => bcrypt('securepassword123'),
            'role' => 'admin',
        ]);

        // 2. Contoh Eksekusi 30 Data Massal Menggunakan Factory
        User::factory(30)->create();

        // 3. Tingkat Lanjut: Membuat User Sekaligus Mengisi Relasi Post Miliknya
        User::factory(10)->create()->each(function ($user) {
            Post::factory(rand(3, 7))->create([
                'user_id' => $user->id
            ]);
        });
    }
}

Jangan lupa mendaftarkan kelas seeder Anda ke dalam file manajemen utama di database/seeders/DatabaseSeeder.php menggunakan method call:

public function run(): void
{
    $this->call([
        UserSeeder::class,
        // Tambahkan nama class seeder lainnya di bawah ini
    ]);
}

3. Ragam Perintah Eksekusi Seeding

Jalankan pengisian data terstruktur Anda melalui baris perintah terminal Artisan berikut:

# Menjalankan DatabaseSeeder utama (mengeksekusi seluruh seeder terdaftar)
php artisan db:seed

# Menjalankan hanya satu class seeder spesifik
php artisan db:seed --class=UserSeeder

# Mengosongkan seluruh tabel database, membangun ulang skema, dan mengisi seeder dari nol
php artisan migrate:fresh --seed

# Memaksa eksekusi seeder dalam lingkungan server produksi (Production)
php artisan db:seed --force
Praktik Terbaik Pengelolaan Seeders & Factories

Ikuti pedoman standarisasi berikut untuk menjaga kode program Anda tetap bersih dan terhindar dari galat memori eksekusi:

  • Gunakan Fungsi fake() Global: Mulai Laravel 9 ke atas, gunakan helper global fake() daripada variabel instans properti lama $this->faker untuk kemudahan pembacaan skrip.
  • Manfaatkan Nilai Unik (Unique Constraints): Saat menghasilkan data tiruan yang memiliki indeks unik di database (seperti alamat email), pastikan Anda memanggil fungsi berantai unique: fake()->unique()->safeEmail() untuk mencegah kegagalan eksekusi akibat duplikasi data acak.
  • Gunakan Metode Model::insert() untuk Performa Massal: Jika Anda ingin menginput ribuan data statis tanpa membutuhkan event pemicu Eloquent (*Model Observers*), gunakan raw array via User::insert([...]) karena jauh lebih hemat memori daripada melakukan looping metode create() satu per satu.
  • Jangan Masukkan Data Tiruan di Produksi: Buat berkas pemisah yang jelas antara data pengetesan pengujian dengan data master utama. Gunakan flag keamanan penentu lingkungan (*environment check*) jika ingin mengamankan eksekusi seeder di server produksi.
v