CRUD adalah singkatan dari Create, Read, Update, Delete โ empat operasi dasar yang hampir selalu ada di setiap aplikasi web. Di Laravel, membuat CRUD bisa dilakukan dengan sangat efisien berkat fitur seperti Eloquent ORM, Resource Controller, dan Blade templating. Artikel ini akan memandu kamu membuat CRUD lengkap dari awal menggunakan Laravel 10/11.
Persiapan Awal
Pastikan kamu sudah menginstal Laravel dan menyiapkan database. Buat project baru jika belum ada:
composer create-project laravel/laravel crud-demo
cd crud-demo
cp .env.example .env
php artisan key:generate
Atur koneksi database di file .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=crud_demo
DB_USERNAME=root
DB_PASSWORD=
Membuat Migration dan Model
Kita akan membuat fitur CRUD untuk data produk. Jalankan perintah berikut untuk membuat model beserta migrationnya sekaligus:
php artisan make:model Product -m
Buka file migration yang baru dibuat di folder database/migrations/ dan tambahkan kolom yang dibutuhkan:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description')->nullable();
$table->decimal('price', 10, 2);
$table->integer('stock')->default(0);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('products');
}
};
Jalankan migration:
php artisan migrate
Mengisi Model Product
Buka app/Models/Product.php dan tambahkan properti $fillable:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'description', 'price', 'stock'];
}
Membuat Resource Controller
Resource controller otomatis menyediakan method untuk semua operasi CRUD:
php artisan make:controller ProductController --resource --model=Product
Buka app/Http/Controllers/ProductController.php dan isi setiap method:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function index()
{
$products = Product::latest()->paginate(10);
return view('products.index', compact('products'));
}
public function create()
{
return view('products.create');
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
]);
Product::create($request->all());
return redirect()->route('products.index')
->with('success', 'Produk berhasil ditambahkan.');
}
public function show(Product $product)
{
return view('products.show', compact('product'));
}
public function edit(Product $product)
{
return view('products.edit', compact('product'));
}
public function update(Request $request, Product $product)
{
$request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
]);
$product->update($request->all());
return redirect()->route('products.index')
->with('success', 'Produk berhasil diperbarui.');
}
public function destroy(Product $product)
{
$product->delete();
return redirect()->route('products.index')
->with('success', 'Produk berhasil dihapus.');
}
}
Mendaftarkan Route
Buka routes/web.php dan daftarkan resource route:
use App\Http\Controllers\ProductController;
Route::resource('products', ProductController::class);
Satu baris ini otomatis mendaftarkan 7 route: index, create, store, show, edit, update, dan destroy.
Membuat View Blade
Buat folder resources/views/products/, lalu buat file index.blade.php:
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Daftar Produk</h1>
<a href="{{ route('products.create') }}" class="btn btn-primary">Tambah Produk</a>
@if(session('success'))
<div class="alert alert-success mt-2">{{ session('success') }}</div>
@endif
<table class="table mt-3">
<thead>
<tr>
<th>Nama</th>
<th>Harga</th>
<th>Stok</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@foreach($products as $product)
<tr>
<td>{{ $product->name }}</td>
<td>Rp {{ number_format($product->price, 0, ',', '.') }}</td>
<td>{{ $product->stock }}</td>
<td>
<a href="{{ route('products.edit', $product) }}" class="btn btn-sm btn-warning">Edit</a>
<form action="{{ route('products.destroy', $product) }}" method="POST" style="display:inline">
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger">Hapus</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
{{ $products->links() }}
</div>
@endsection
Menjalankan Aplikasi
Setelah semua view dibuat (create.blade.php dan edit.blade.php dengan form yang sesuai), jalankan server:
php artisan serve
Akses http://localhost:8000/products untuk melihat hasilnya.
Kesimpulan
Kamu telah berhasil membuat fitur CRUD lengkap di Laravel menggunakan Resource Controller dan Eloquent ORM. Dengan pendekatan ini, kode menjadi terstruktur dan mudah dikembangkan. Langkah selanjutnya, kamu bisa menambahkan validasi yang lebih kompleks, upload gambar, atau membungkus CRUD ini dengan autentikasi menggunakan Laravel Breeze.