Skip to content

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:

php
public function edit(Student $student)
{
    return view('students.edit', compact('student'));
}

Laravel Route Model Binding: Parameter Student $student otomatis mengambil data dari DB berdasarkan ID di URL. Tidak perlu Student::find($id) manual!

Method update() di StudentController.php:

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

html
@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>
@endsection

2. Implementasi: destroy() — Hapus Data

Method destroy() di StudentController.php:

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:

html
<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:

#SkenarioExpected Result
1Buka /studentsTampil daftar siswa
2Klik "Tambah Siswa", isi form, submitData baru muncul di list
3Klik "Edit" pada salah satu barisForm edit terbuka dengan data yang sudah terisi
4Ubah nama, klik UpdateNama di list berubah
5Klik "Hapus" → confirm → OKData hilang dari list
6Submit form edit dengan nama kosongMuncul pesan validasi error

5. Tambahkan Konfirmasi Hapus yang Lebih Baik (Opsional)

Ganti onsubmit="return confirm(...)" dengan dialog yang lebih informatif:

html
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.

Program Magang SMK RPL — Rekayasa Perangkat Lunak