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:
3.2Langkah 1 — Buat berkas seeder
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
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):
Periksa jumlah data di tinker:
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:
migrate:fresh menghapus semua tabel dan datanya, lalu membuatnya ulang. Gunakan hanya saat belajar!
3.6Jalankan test
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=SiswaSeederberhasil 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
firstOrCreatemenjadicreatesementara, jalankan seeder dua kali, lihat jumlah siswa. Kembalikan setelahnya danphp artisan migrate:freshlalu seed ulang.
Pertanyaan pemahaman
- Apa arti idempotent? Bagian kode mana yang membuat seeder ini idempotent?
- Apa beda
Siswa::create()danSiswa::firstOrCreate()? - Mengapa
firstOrCreatemencari berdasarkannamadanno_hp, bukan hanyanama? Apa risikonya kalau ada dua siswa bernama sama? - 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.