Tutorial ini adalah bagian terakhir dari seri CRUD (Create, Read, Update, Delete) kita. Anda akan belajar cara mengimplementasikan fungsionalitas Delete untuk menghapus data dari database menggunakan Laravel.
Langkah 1: Menambahkan Metode destroy di Controller
Kita akan menambahkan metode destroy di ProductController yang akan bertanggung jawab untuk menghapus data.
Buka file app/Http/Controllers/ProductController.php dan tambahkan atau lengkapi metode destroy seperti di bawah ini:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
// ... metode index(), create(), store(), edit(), update() ...
/**
* Remove the specified resource from storage.
*/
public function destroy(Product $product)
{
// Hapus data produk
$product->delete();
// Redirect kembali ke halaman daftar produk dengan pesan sukses
return redirect()->route('products.index')->with('success', 'Produk berhasil dihapus!');
}
}
Penjelasan Kode
destroy(Product $product): Sama seperti metodeeditdanupdate, kita menggunakan Route Model Binding yang memungkinkan Laravel secara otomatis menemukan produk berdasarkan ID di URL dan mengikatnya ke parameter$product.$product->delete();: Ini adalah metode Eloquent yang sederhana dan efisien untuk menghapus baris dari database. Metode ini akan menjalankan perintah SQLDELETEdi belakang layar.return redirect()->route('products.index')->with('success', ...): Setelah data berhasil dihapus, kita mengarahkan pengguna kembali ke halaman daftar produk dan menambahkan pesan sukses.
Langkah 2: Menambahkan Form Tombol Hapus di View
Untuk menghapus data, kita tidak bisa menggunakan link <a> biasa dengan metode GET karena itu tidak aman. Sebaliknya, kita akan menggunakan form HTML dengan metode POST yang disamarkan sebagai DELETE menggunakan direktif @method.
Buka file resources/views/products/index.blade.php dan tambahkan form ini di dalam loop @foreach di samping link “Edit”:
...
<td>
<a href="{{ route('products.edit', $product->id) }}">Edit</a>
<form action="{{ route('products.destroy', $product->id) }}" method="POST" style="display:inline;">
@csrf
@method('DELETE')
<button type="submit" onclick="return confirm('Apakah Anda yakin ingin menghapus produk ini?')">Hapus</button>
</form>
</td>
...
Penjelasan Kode
<form action="{{ route('products.destroy', $product->id) }}" method="POST" ...>: Form ini akan mengirimkan permintaan ke URL yang sesuai dengan metodedestroydi controller, dengan ID produk yang akan dihapus.@csrf: Direktif Blade ini melindungi form dari serangan Cross-Site Request Forgery (CSRF).@method('DELETE'): Direktif ini adalah kunci. Ini memberi tahu Laravel bahwa permintaanPOSTini harus diperlakukan sebagai permintaanDELETE.<button type="submit" ...>: Kita menggunakan tombolsubmituntuk mengirimkan form.onclick="return confirm('...')": Ini adalah validasi JavaScript sederhana untuk menampilkan dialog konfirmasi kepada pengguna sebelum data dihapus. Ini adalah praktik yang baik untuk mencegah penghapusan yang tidak disengaja.
Langkah 3: Menambahkan Route
Terakhir, kita perlu memastikan route untuk metode destroy sudah terdefinisi. Jika Anda membuat ProductController dengan opsi --resource, route ini sudah otomatis dibuat.
Anda dapat memverifikasinya di file routes/web.php:
use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;
// ... route lainnya ...
Route::resource('products', ProductController::class);
Atau jika Anda mendefinisikan route secara manual:
// ...
Route::delete('/products/{product}', [ProductController::class, 'destroy'])->name('products.destroy');
Fungsi Route::resource() adalah cara cepat untuk membuat semua route CRUD secara otomatis, termasuk delete.
Selesai!
Sekarang Anda dapat mengunjungi http://localhost:8000/products di browser Anda. Klik tombol “Hapus” di samping salah satu produk. Setelah konfirmasi, produk tersebut akan dihapus dari database, dan Anda akan melihat halaman daftar produk diperbarui dengan pesan sukses. Selamat, Anda telah berhasil mengimplementasikan operasi Delete dalam CRUD Laravel.