Lompat ke isi
Les Laravel DocsTutorial Les Privat · Laravel CRUD
Unduh Starter Pack
Sesi 2: Seeder, Route & ReadEstimasi: 30 menit4 titik periksa

Bab 3 — Data Awal dengan Seeder

3.1Konsep

Mengapa perlu seeder?

Database yang baru dibuat itu kosong. Di bab-bab berikutnya kamu butuh data untuk melihat daftar, mengubah, dan menghapus. Daripada mengetik data satu per satu di tinker setiap kali tabel di-reset, kita buat seeder: berkas kode pengisi data awal yang bisa diulang kapan saja.

Idempotent

Seeder yang baik aman dijalankan berkali-kali. Dijalankan sekali atau sepuluh kali, hasilnya sama: tetap 5 siswa, bukan 50. Caranya: cek dulu apakah datanya sudah ada, baru tambahkan kalau belum. Laravel menyediakan firstOrCreate() yang melakukan cek-lalu-buat sekaligus:

PHP
Siswa::firstOrCreate(    ['nama' => 'Budi Santoso', 'no_hp' => '081234567890'],   // 1. cari siswa seperti ini    ['program_les' => 'Coding']                              // 2. kalau belum ada, buat dengan tambahan ini);

3.2Langkah 1 — Buat berkas seeder

PowerShell
php artisan make:seeder SiswaSeeder

Berkas database/seeders/SiswaSeeder.php terbentuk dengan method run() yang masih kosong.

3.3Langkah 2 — Isi seeder

📄 Ganti seluruh isi berkas database/seeders/SiswaSeeder.php

database/seeders/SiswaSeeder.phpPHP
<?phpnamespace Database\Seeders;use App\Models\Siswa;use Illuminate\Database\Seeder;class SiswaSeeder extends Seeder{    public function run(): void    {        $data = [            ['Budi Santoso', 'Coding', '081234567890'],            ['Sari Wulandari', 'Matematika', '082345678901'],            ['Dimas Pratama', 'Coding', '083456789012'],            ['Rani Oktaviani', 'Bahasa Inggris', '085678901234'],            ['Andre Saputra', 'Matematika', '087789012345'],        ];        foreach ($data as [$nama, $program, $noHp]) {            Siswa::firstOrCreate(                ['nama' => $nama, 'no_hp' => $noHp],                ['program_les' => $program]            );        }    }}

3.4Membaca kodenya

Bagian Apa yang dilakukan Konsep
$data = [ [...], [...] ] Daftar 5 siswa, tiap siswa berupa array berisi [nama, program, noHp] Array di dalam array
foreach ($data as [$nama, $program, $noHp]) Mengulang tiap siswa dan langsung memecah isinya jadi tiga variabel Perulangan + destructuring
Siswa::firstOrCreate(...) Cari siswa dengan nama dan no_hp itu. Kalau tidak ada, buat baru Idempotent

3.5Uji coba

Mulai dari database bersih supaya hitungannya mudah (data percobaan Bab 2 ikut terhapus, tidak apa-apa):

PowerShell
php artisan migrate:freshphp artisan db:seed --class=SiswaSeeder

Periksa jumlah data di tinker:

PowerShell
php artisan tinker
PHP
App\Models\Siswa::count();

Hasilnya harus 5.

Sekarang jalankan seeder sekali lagi, bahkan dua kali, lalu cek Siswa::count() lagi. Angkanya tidak boleh bertambah. Itulah idempotent.

Mengulang dari awal

Kalau data praktikmu berantakan dan ingin mulai bersih:

PowerShell
php artisan migrate:freshphp artisan db:seed --class=SiswaSeeder

migrate:fresh menghapus semua tabel dan datanya, lalu membuatnya ulang. Gunakan hanya saat belajar!

3.6Jalankan test

PowerShell
php artisan test --filter=SeederSiswaTest

Tiga test memeriksa: seeder mengisi 5 siswa, aman dijalankan tiga kali (tetap 5), dan semua data contoh terisi lengkap. Harapannya: Tests: 3 passed.


Titik periksa Bab 3

Centang setiap butir yang sudah kamu selesaikan.

  • php artisan db:seed --class=SiswaSeeder berhasil tanpa galat.
  • Siswa::count() di tinker menghasilkan jumlah yang benar, dan tidak bertambah setelah seeder dijalankan ulang.
  • php artisan test --filter=SeederSiswaTest → 3 test hijau.
  • Uji sendiri: ganti firstOrCreate menjadi create sementara, jalankan seeder dua kali, lihat jumlah siswa. Kembalikan setelahnya dan php artisan migrate:fresh lalu seed ulang.

Pertanyaan pemahaman

  1. Apa arti idempotent? Bagian kode mana yang membuat seeder ini idempotent?
  2. Apa beda Siswa::create() dan Siswa::firstOrCreate()?
  3. Mengapa firstOrCreate mencari berdasarkan nama dan no_hp, bukan hanya nama? Apa risikonya kalau ada dua siswa bernama sama?
  4. Apa yang terjadi pada datamu kalau menjalankan php artisan migrate:fresh? Kapan perintah itu tidak boleh dipakai?

Tantangan

Hubungkan seeder ke DatabaseSeeder.php supaya cukup menjalankan php artisan db:seed (tanpa --class). Di method run() milik DatabaseSeeder, tambahkan $this->call(SiswaSeeder::class);. Ujilah, lalu pastikan jumlah siswa tetap 5.

Kesalahan umum

Gejala Penyebab & solusi
Target class [SiswaSeeder] does not exist Nama kelas salah ketik, atau berkas belum disimpan. Nama kelas harus sama dengan nama berkas.
MassAssignmentException $fillable di model belum lengkap (lihat Bab 2).
no such table: siswas Migration belum dijalankan. Jalankan php artisan migrate.
Jumlah siswa bertambah tiap kali seeder dijalankan Memakai create() bukan firstOrCreate().
Class "App\Models\Siswa" not found di seeder Lupa baris use App\Models\Siswa; di atas kelas.

➡️ Lanjut ke Bab 4 — Route dan Kerangka Controller.

Tutorial Data Siswa Les — Laravel CRUD untuk les privat.

Kode boleh disalin, tapi coba ketik sendiri dulu: tangan yang mengetik lebih cepat paham.