Factory & Seeder

Mengisi database dengan data uji realistis memakai factory (Faker) dan seeder.

Part 14 dari 26 ± 35 menit Gratis

Mengapa data uji?

Aplikasi kosong sulit dikembangkan dan diuji. Kamu butuh puluhan produk, kategori, dan pengguna palsu tetapi realistis. Laravel menyediakan dua alat:

  • Factory: "pabrik" yang memproduksi satu atau banyak model dengan data acak (memakai pustaka Faker).
  • Seeder: skrip yang menjalankan factory/query untuk mengisi database.

Factory

php artisan make:factory ProdukFactory --model=Produk
<?php

namespace Database\Factories;

use App\Models\Kategori;
use App\Models\Produk;
use Illuminate\Database\Eloquent\Factories\Factory;

class ProdukFactory extends Factory
{
    protected $model = Produk::class;

    public function definition(): array
    {
        return [
            'kategori_id' => Kategori::factory(),         // buat kategori baru bila tidak diberikan
            'nama'        => fake()->words(3, true),
            'slug'        => fake()->unique()->slug(),
            'deskripsi'   => fake()->paragraph(),
            'harga'       => fake()->numberBetween(5000, 500000),
            'stok'        => fake()->numberBetween(0, 100),
            'aktif'       => true,
        ];
    }

    public function habis(): static                       // "state": variasi siap pakai
    {
        return $this->state(fn (array $attributes) => ['stok' => 0]);
    }
}

fake() adalah helper Faker. Beberapa generator: name(), email(), sentence(), paragraph(), numberBetween(), boolean(), dateTimeBetween(), randomElement([...]), unique() (menjamin nilai tidak kembar). Untuk data berbahasa Indonesia, atur APP_FAKER_LOCALE=id_ID di .env.

Memakai factory

Produk::factory()->create();                         // 1 produk tersimpan
Produk::factory()->count(50)->create();             // 50 produk
Produk::factory()->make();                           // objek TANPA disimpan
Produk::factory()->habis()->count(5)->create();     // pakai state
Produk::factory()->create(['nama' => 'Kopi Khusus']);// timpa atribut tertentu
Kategori::factory()->has(Produk::factory()->count(10))->create();   // kategori + 10 produk
Produk::factory()->hasTags(3)->create();           // relasi many-to-many

Agar Produk::factory() dikenali, model memakai trait HasFactory.

Seeder

php artisan make:seeder ProdukSeeder
<?php

namespace Database\Seeders;

use App\Models\Kategori;
use App\Models\Produk;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        Kategori::factory()->count(5)->create();
        Produk::factory()->count(50)->create();
        Produk::factory()->habis()->count(5)->create();

        $this->call([UserSeeder::class]);      // panggil seeder lain
    }
}
php artisan db:seed                      # jalankan DatabaseSeeder
php artisan db:seed --class=ProdukSeeder # seeder tertentu
php artisan migrate:fresh --seed         # reset database + isi ulang (development)

Seeder untuk data nyata

Data referensi tetap (daftar provinsi, peran, kategori awal) cocok di seeder biasa (bukan factory), kadang dengan updateOrCreate agar aman dijalankan berulang di produksi. Jangan menjalankan migrate:fresh di produksi!

Manfaat lain

  • Factory dipakai ulang di tes otomatis (bab testing).
  • Anggota tim baru cukup migrate:fresh --seed untuk punya data kerja.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X