CRUD (Create, Read, Update, Delete) adalah fondasi hampir setiap aplikasi web. Begitu Anda menguasainya di Laravel, membangun fitur apa pun — dari aplikasi kasir hingga inventory — menjadi jauh lebih mudah karena polanya berulang. Tutorial ini membangun CRUD produk lengkap di Laravel 11 dari nol, dengan kode yang bisa langsung Anda salin dan pahami.
1. Menyiapkan Tabel lewat Migration
Alih-alih membuat tabel manual di phpMyAdmin, gunakan migration agar struktur database ikut terlacak di kode. Buat model sekaligus migration-nya:
php artisan make:model Product -m
Buka file migration di database/migrations/ dan definisikan kolomnya:
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->integer('price');
$table->integer('stock')->default(0);
$table->text('description')->nullable();
$table->timestamps();
});
}
Jalankan migrasi untuk membuat tabel:
php artisan migrate
2. Menyiapkan Model
Agar bisa mengisi data secara massal lewat create() dan update(), daftarkan kolom yang boleh diisi pada properti $fillable. Langkah ini melindungi Anda dari celah mass assignment:
class Product extends Model
{
protected $fillable = ['name', 'price', 'stock', 'description'];
}
3. Membuat Resource Controller
Laravel punya controller khusus yang sudah menyiapkan tujuh method CRUD sekaligus. Buat dengan flag --resource:
php artisan make:controller ProductController --resource
Daftarkan satu baris route yang otomatis memetakan semua method tersebut di routes/web.php:
use App\Http\Controllers\ProductController;
Route::resource('products', ProductController::class);
Cek hasilnya dengan php artisan route:list — Anda akan melihat route index, create, store, edit, update, dan destroy tercipta otomatis.
4. Menampilkan dan Menyimpan Data
Isi method index() untuk menampilkan daftar, dan store() untuk menyimpan data baru:
public function index()
{
$products = Product::latest()->paginate(10);
return view('products.index', compact('products'));
}
public function store(StoreProductRequest $request)
{
Product::create($request->validated());
return redirect()->route('products.index')
->with('success', 'Produk berhasil ditambahkan.');
}
5. Validasi yang Rapi dengan Form Request
Perhatikan tipe parameter StoreProductRequest di atas. Alih-alih menumpuk aturan validasi di controller, pindahkan ke kelas khusus agar controller tetap bersih:
php artisan make:request StoreProductRequest
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'price' => 'required|integer|min:0',
'stock' => 'required|integer|min:0',
];
}
Jika validasi gagal, Laravel otomatis mengembalikan pengguna ke form beserta pesan error — tanpa kode tambahan.
6. Tampilan Blade Sederhana
Buat resources/views/products/index.blade.php untuk menampilkan data dalam tabel:
@foreach ($products as $product)
<tr>
<td>{{ $product->name }}</td>
<td>{{ number_format($product->price) }}</td>
<td>{{ $product->stock }}</td>
</tr>
@endforeach
{{ $products->links() }}
Baris {{ $products->links() }} otomatis menampilkan navigasi pagination.
7. Memperbarui dan Menghapus
Berkat route model binding, Laravel otomatis mencarikan record berdasarkan ID di URL:
public function update(StoreProductRequest $request, Product $product)
{
$product->update($request->validated());
return redirect()->route('products.index')
->with('success', 'Produk diperbarui.');
}
public function destroy(Product $product)
{
$product->delete();
return back()->with('success', 'Produk dihapus.');
}
Menambahkan Pencarian & Pagination
Aplikasi nyata butuh pencarian. Gunakan when() agar filter hanya aktif saat ada kata kunci:
$products = Product::query()
->when($request->q, fn($query) =>
$query->where('name', 'like', '%'.$request->q.'%'))
->latest()
->paginate(10)
->withQueryString();
withQueryString() menjaga kata kunci tetap terbawa saat berpindah halaman.
Kesalahan Umum yang Perlu Dihindari
- Lupa
$fillable: menyebabkan MassAssignmentException saatcreate(). - Tidak memvalidasi input: data kotor masuk ke database dan membuka celah keamanan.
- Menaruh semua logika di controller: gunakan Form Request dan, untuk logika kompleks, Service class.
Dengan tujuh langkah ini Anda sudah memiliki CRUD utuh yang aman dan rapi. Pola yang sama bisa Anda ulang untuk entitas lain seperti pelanggan, transaksi, atau kategori — inilah alasan menguasai CRUD membuat pembangunan aplikasi berikutnya terasa jauh lebih cepat.
Langkah Selanjutnya Setelah Menguasai CRUD
Setelah memahami operasi buat, baca, ubah, dan hapus, Anda telah menguasai fondasi paling penting dalam pengembangan aplikasi. Langkah berikutnya adalah memperkuat dasar tersebut dengan validasi input yang rapi agar data yang masuk selalu benar. Pelajari relasi antar-tabel seperti satu ke banyak dan banyak ke banyak untuk membangun fitur yang lebih kompleks. Tambahkan autentikasi agar hanya pengguna berwenang yang dapat mengubah data, lalu terapkan otorisasi peran untuk kontrol yang lebih halus. Percantik antarmuka dengan komponen yang dapat dipakai ulang dan tingkatkan pengalaman pengguna melalui pesan umpan balik yang jelas. Jangan lupa menulis pengujian agar fitur tetap andal saat aplikasi berkembang. Dengan membangun bertahap di atas fondasi CRUD, Anda akan mampu menciptakan aplikasi yang lengkap, aman, dan mudah dipelihara.
Pertanyaan Umum (FAQ)
Apa itu CRUD? Singkatan dari Create, Read, Update, Delete, yaitu empat operasi dasar pengelolaan data yang menjadi fondasi hampir semua aplikasi.
Apakah perlu menguasai CRUD sebelum fitur lanjutan? Ya. CRUD adalah dasar; setelah menguasainya, relasi, autentikasi, dan fitur kompleks lain jauh lebih mudah dipahami.
Bagaimana menjaga data tetap valid? Terapkan validasi input pada setiap operasi buat dan ubah agar data yang tersimpan selalu benar dan konsisten.