Bab 7 — Update: Mengubah Data Siswa
7.1Konsep
Kasus nyata dari Bu Rina
"Kalau ada murid pindah program, saya harus mencoret-coret." Dengan fitur ubah, Bu Rina cukup membuka data murid itu, mengganti program lesnya, dan menyimpan.
Dua method berpasangan, lagi
Pola ini sama dengan Bab 6, dengan dua perbedaan penting:
- Method controller menerima
Siswa $siswa, siswa yang sudah dicari Laravel dari alamat (route model binding, Bab 4). Kamu tidak perlu menulisSiswa::find($id). - Menyimpan perubahan memakai
$siswa->update($data), bukancreate().update()menimpa baris yang sudah ada, jadi jumlah siswa tidak bertambah.
Mengapa @method('PUT')?
Formulir HTML hanya mengenal dua method: GET dan POST. Sedangkan rute siswa.update menunggu method PUT. Solusinya, formulir tetap dikirim lewat POST, tetapi membawa penanda tersembunyi:
Laravel membaca penanda itu dan memperlakukan permintaan sebagai PUT.
7.2Langkah 1 — Isi edit() dan update()
📄 Berkas app/Http/Controllers/SiswaController.php — ganti isi method edit() dan update()
Bandingkan update() dengan store() dari Bab 6. Apa saja yang sama dan apa yang beda? Tulis di bukumu sebelum lanjut.
7.3Langkah 2 — Tambahkan tombol Edit
Tombol Edit sudah ada di index.blade.php dari Paket Starter. Temukan baris ini:
route('siswa.edit', $siswa->id) menghasilkan alamat seperti /siswa/5/edit. Angka 5 diambil dari id siswa pada baris itu.
7.4Membaca tampilan edit sendiri
Buka resources/views/siswa/edit.blade.php. Bandingkan dengan create.blade.php. Cari tiga hal yang berbeda:
| Yang berbeda | Di create.blade.php |
Di edit.blade.php |
|---|---|---|
Tujuan formulir (action) |
… | … |
| Penanda method | … | … |
Isi awal tiap kolom (value) |
… | … |
Isi tabel di bukumu. Jawabannya: tujuan route('siswa.update', $siswa->id), penanda @method('PUT'), dan isi awal old('nama', $siswa->nama), artinya "tampilkan isian terakhir yang diketik; kalau belum ada, tampilkan data lama dari database".
7.5💥 Galat yang sengaja dibuat: tanpa @method('PUT')
- Di
edit.blade.php, beri komentar pada baris@method('PUT')({{-- @method('PUT') --}}) dan simpan. - Buka salah satu siswa lewat tombol Edit, ubah sesuatu, klik Perbarui.
- Kamu akan melihat galat 405 Method Not Allowed (bunyi kira-kira: The POST method is not supported for route siswa/1. Supported methods: ...). Tulis di bukumu: kenapa HTML biasa tidak bisa langsung mengirim PUT?
- Kembalikan barisnya.
7.6Uji coba
- Klik Edit pada salah satu siswa. Formulir terisi data lama.
- Ganti Program Les (mis. dari Matematika menjadi Coding) lalu Perbarui. Kembali ke daftar dengan pesan hijau Data siswa berhasil diperbarui!, dan jumlah baris di daftar tetap sama.
- Buka lewat alamat
/siswa/9999/edit. Muncul 404.
7.7Jalankan test
Lima test memeriksa: formulir edit terisi data lama, update valid mengubah data tanpa menambah baris, pesan sukses muncul, nama kosong ditolak dan data lama tetap utuh, serta siswa yang tidak ada menghasilkan 404. Harapannya: Tests: 5 passed.
Titik periksa Bab 7
Centang setiap butir yang sudah kamu selesaikan.
- Klik Edit: formulir terisi data lama siswa itu.
- Ubah program les lalu Perbarui: data baru tampil, jumlah baris tetap sama.
- Tanpa
@method('PUT')muncul 405, dan setelah dikembalikan formulir bekerja lagi. /siswa/9999/editmenghasilkan 404.php artisan test --filter=UbahSiswaTest→ 5 test hijau.
Pertanyaan pemahaman
- Apa beda
create()denganupdate()dalam hal apa yang terjadi pada tabel? - Apa itu route model binding? Kenapa
edit(Siswa $siswa)tidak perlu mencari siswa secara manual? - Kenapa formulir edit butuh
@method('PUT')? - Kalau
update()memakaiSiswa::create($data)karena salah ketik, apa yang terjadi pada daftar siswa? Bagaimana test membuktikannya?
Tantangan
Ubah pesan sukses di update() supaya menyebut nama siswa, mis. "Data Budi Santoso berhasil diperbarui!" (petunjuk: pakai $siswa->nama di dalam teks). Perhatikan test mana yang merah, kenapa, dan perbarui test itu atau kembalikan pesannya.
Kesalahan umum
| Gejala | Penyebab & solusi |
|---|---|
405 Method Not Allowed |
@method('PUT') hilang dari formulir edit. |
419 Page Expired |
@csrf hilang dari formulir edit. |
| Muncul siswa kembar setelah "Perbarui" | update() terlanjur memakai create(), atau action formulir menuju siswa.store. |
| Formulir edit kosong, tidak terisi data lama | compact('siswa') salah ketik, atau tampilan tidak memakai $siswa->nama. |
Undefined variable $siswa |
Nama yang dikirim ke tampilan tidak cocok dengan variabel di tampilan. Kalau pesannya compact(): Undefined variable ..., nama di compact() tidak cocok dengan parameter Siswa $siswa. |
404 pada /siswa/5/edit padahal siswa ada |
Siswa dengan id 5 memang tidak ada. Cek Siswa::all() di tinker. |
➡️ Lanjut ke Bab 8 — Delete: Menghapus Data Siswa.