Factory & Seeder
Mengisi database dengan data uji realistis memakai factory (Faker) dan seeder.
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 --seeduntuk punya data kerja.