Lompat ke isi
Les Laravel DocsTutorial Les Privat · Laravel CRUD
Unduh Starter Pack
Sesi 3: Create & UpdateEstimasi: 40 menit5 titik periksa

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

Teks
edit()    → menampilkan formulir berisi DATA LAMA      (GET /siswa/5/edit)update()  → menerima isian, memeriksa, menimpa data     (PUT /siswa/5)

Pola ini sama dengan Bab 6, dengan dua perbedaan penting:

  1. Method controller menerima Siswa $siswa, siswa yang sudah dicari Laravel dari alamat (route model binding, Bab 4). Kamu tidak perlu menulis Siswa::find($id).
  2. Menyimpan perubahan memakai $siswa->update($data), bukan create(). 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:

HTML
<form action="..." method="POST">    @csrf    @method('PUT')   <!-- menghasilkan <input type="hidden" name="_method" value="PUT"> -->

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()

app/Http/Controllers/SiswaController.phpPHP
    public function edit(Siswa $siswa)    {        return view('siswa.edit', compact('siswa'));    }    public function update(Request $request, Siswa $siswa)    {        $data = $request->validate([            'nama' => 'required',            'program_les' => 'required',            'no_hp' => 'required',        ]);        $siswa->update($data);        return redirect()->route('siswa.index')            ->with('success', 'Data siswa berhasil diperbarui!');    }

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:

HTML
<a href="{{ route('siswa.edit', $siswa->id) }}" class="btn btn-warning btn-sm">Edit</a>

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')

  1. Di edit.blade.php, beri komentar pada baris @method('PUT') ({{-- @method('PUT') --}}) dan simpan.
  2. Buka salah satu siswa lewat tombol Edit, ubah sesuatu, klik Perbarui.
  3. 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?
  4. Kembalikan barisnya.

7.6Uji coba

  1. Klik Edit pada salah satu siswa. Formulir terisi data lama.
  2. 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.
  3. Buka lewat alamat /siswa/9999/edit. Muncul 404.

7.7Jalankan test

PowerShell
php artisan test --filter=UbahSiswaTest

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/edit menghasilkan 404.
  • php artisan test --filter=UbahSiswaTest → 5 test hijau.

Pertanyaan pemahaman

  1. Apa beda create() dengan update() dalam hal apa yang terjadi pada tabel?
  2. Apa itu route model binding? Kenapa edit(Siswa $siswa) tidak perlu mencari siswa secara manual?
  3. Kenapa formulir edit butuh @method('PUT')?
  4. Kalau update() memakai Siswa::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.

Tutorial Data Siswa Les — Laravel CRUD untuk les privat.

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