Day 8 — CRUD: Update & Delete
Fase: 1 — Fundamental Laravel | Minggu: 2 | Hari: Rabu
🎯 Tujuan Hari Ini
Peserta melengkapi fitur CRUD dengan implementasi Edit (Update) dan Hapus (Delete) sehingga aplikasi manajemen data siswa menjadi 100% fungsional.
📋 Task Wajib
1. Implementasi: edit() & update() — Edit Data
Method edit() di StudentController.php:
public function edit(Student $student)
{
return view('students.edit', compact('student'));
}Laravel Route Model Binding: Parameter
Student $studentotomatis mengambil data dari DB berdasarkan ID di URL. Tidak perluStudent::find($id)manual!
Method update() di StudentController.php:
public function update(Request $request, Student $student)
{
$request->validate([
'name' => 'required|min:3|max:100',
'gender' => 'required|in:L,P',
'phone' => 'nullable|max:15',
'school' => 'required|max:150',
'active' => 'required|boolean',
]);
$student->update([
'name' => $request->name,
'gender' => $request->gender,
'phone' => $request->phone,
'school' => $request->school,
'active' => $request->active,
]);
return redirect()->route('students.index')->with('success', 'Data siswa berhasil diperbarui!');
}Buat view: resources/views/students/edit.blade.php
@extends('layouts.app')
@section('title', 'Edit Siswa')
@section('content')
<h1>Edit Data Siswa</h1>
<p style="color:#999; margin-bottom:20px;">ID: {{ $student->id }} | Dibuat: {{ $student->created_at->format('d M Y') }}</p>
<form method="POST" action="{{ route('students.update', $student->id) }}"
style="background:white; padding:30px; border-radius:10px; max-width:600px;">
@csrf
@method('PUT')
<div style="margin-bottom:20px;">
<label style="display:block; font-weight:bold; margin-bottom:6px;">Nama Lengkap *</label>
<input type="text" name="name" value="{{ old('name', $student->name) }}"
style="width:100%; padding:10px; border:1px solid #ddd; border-radius:6px;">
@error('name') <span style="color:red; font-size:13px;">{{ $message }}</span> @enderror
</div>
<div style="margin-bottom:20px;">
<label style="display:block; font-weight:bold; margin-bottom:6px;">Jenis Kelamin *</label>
<select name="gender" style="width:100%; padding:10px; border:1px solid #ddd; border-radius:6px;">
<option value="L" {{ old('gender', $student->gender) == 'L' ? 'selected' : '' }}>Laki-laki</option>
<option value="P" {{ old('gender', $student->gender) == 'P' ? 'selected' : '' }}>Perempuan</option>
</select>
@error('gender') <span style="color:red; font-size:13px;">{{ $message }}</span> @enderror
</div>
<div style="margin-bottom:20px;">
<label style="display:block; font-weight:bold; margin-bottom:6px;">No. HP</label>
<input type="text" name="phone" value="{{ old('phone', $student->phone) }}"
style="width:100%; padding:10px; border:1px solid #ddd; border-radius:6px;">
</div>
<div style="margin-bottom:20px;">
<label style="display:block; font-weight:bold; margin-bottom:6px;">Nama Sekolah *</label>
<input type="text" name="school" value="{{ old('school', $student->school) }}"
style="width:100%; padding:10px; border:1px solid #ddd; border-radius:6px;">
@error('school') <span style="color:red; font-size:13px;">{{ $message }}</span> @enderror
</div>
<div style="margin-bottom:20px;">
<label style="display:block; font-weight:bold; margin-bottom:6px;">Status</label>
<select name="active" style="width:100%; padding:10px; border:1px solid #ddd; border-radius:6px;">
<option value="1" {{ old('active', $student->active) == 1 ? 'selected' : '' }}>✅ Aktif</option>
<option value="0" {{ old('active', $student->active) == 0 ? 'selected' : '' }}>❌ Nonaktif</option>
</select>
</div>
<div style="display:flex; gap:10px;">
<button type="submit" style="background:#1a1a2e; color:white; padding:12px 30px; border:none; border-radius:6px; cursor:pointer;">
Update
</button>
<a href="{{ route('students.index') }}" style="padding:12px 20px; border:1px solid #ddd; border-radius:6px; text-decoration:none; color:#333;">
Batal
</a>
</div>
</form>
@endsection2. Implementasi: destroy() — Hapus Data
Method destroy() di StudentController.php:
public function destroy(Student $student)
{
$nama = $student->name; // Simpan nama sebelum dihapus
$student->delete();
return redirect()->route('students.index')->with('success', "Data siswa '{$nama}' berhasil dihapus!");
}Tombol hapus sudah dibuat di index.blade.php kemarin via form POST dengan @method('DELETE').
3. Pahami @method('PUT') dan @method('DELETE')
HTML form standar hanya mendukung GET dan POST. Laravel menggunakan method spoofing melalui field tersembunyi:
<form method="POST" ...>
@csrf
@method('PUT') <!-- Atau @method('DELETE') untuk hapus -->
...
</form>Laravel akan membaca field _method=PUT dan memproses request sebagai method yang tepat.
4. Uji Semua Fitur CRUD
Lakukan skenario pengujian berikut secara urut:
| # | Skenario | Expected Result |
|---|---|---|
| 1 | Buka /students | Tampil daftar siswa |
| 2 | Klik "Tambah Siswa", isi form, submit | Data baru muncul di list |
| 3 | Klik "Edit" pada salah satu baris | Form edit terbuka dengan data yang sudah terisi |
| 4 | Ubah nama, klik Update | Nama di list berubah |
| 5 | Klik "Hapus" → confirm → OK | Data hilang dari list |
| 6 | Submit form edit dengan nama kosong | Muncul pesan validasi error |
5. Tambahkan Konfirmasi Hapus yang Lebih Baik (Opsional)
Ganti onsubmit="return confirm(...)" dengan dialog yang lebih informatif:
onsubmit="return confirm('Yakin ingin menghapus data {{ $s->name }}? Tindakan ini tidak bisa dibatalkan!')"📝 Laporan ke Mentor
📌 LAPORAN HARIAN — Day 8
Nama : [Nama Lengkap]
Role : [Role Kamu]
✅ Yang saya kerjakan hari ini:
- [ ] Method edit() dan halaman edit.blade.php selesai
- [ ] Method update() dengan validasi selesai
- [ ] Method destroy() (hapus) selesai
- [ ] Semua skenario CRUD berhasil diuji
📸 Screenshot Wajib:
1. Halaman edit form dengan data siswa sudah terisi
2. Setelah hapus: halaman list kosong dari siswa yang dihapus (dengan flash message)
📊 CRUD Status:
| Create | Read | Update | Delete |
|--------|------|--------|--------|
| ✅ | ✅ | ✅ | ✅ |
❓ Kendala:
[Tulis jika ada]Catatan Mentor
Perkenalkan konsep Soft Delete sebagai bonus: $table->softDeletes() di migration + use SoftDeletes di Model. Data tidak benar-benar terhapus, hanya di-mark sebagai deleted. Ini praktik industri yang umum.