Panduan langkah demi langkah membuat aplikasi CRUD (Create, Read, Update, Delete) sederhana menggunakan Laravel 13 dan MySQL. Lengkap dengan source code!
Memahami konsep CRUD (Create, Read, Update, Delete) adalah fondasi utama sebelum kamu membangun aplikasi web yang lebih kompleks. Di tutorial kali ini, kita akan praktik membuat aplikasi Todo App sederhana menggunakan Laravel 13 dan database MySQL.
Sebelum melangkah lebih jauh, pastikan kamu sudah berhasil melakukan instalasi project awal. Jika belum, kamu bisa ikuti panduan Cara Install Laravel 13 di Windows, Mac, dan Linux terlebih dahulu.
Selain itu, jika kamu penasaran dengan performa dan fitur-fitur baru yang kita gunakan di versi ini, silakan baca ulasan Laravel 13: Apa yang Baru & Panduan Lengkap Fitur Utama.
Prasyarat & Alur Kerja
Pastikan environment kamu sudah siap:
Local Server & MySQL sudah berjalan (Laragon / Herd / XAMPP).
Database MySQL kosong sudah dibuat (misal:
db_laravel13_todo).Project Laravel 13 sudah terinstall.
┌─────────────────────────────────────────────────────────────┐
│ ALUR PENGEMBANGAN CRUD │
├─────────────────────────────────────────────────────────────┤
│ 1. Setup Database (.env) │
│ 2. Buat Migration & Model Task │
│ 3. Buat Controller & Method CRUD │
│ 4. Atur Route Application │
│ 5. Buat Tampilan (Blade View) │
└─────────────────────────────────────────────────────────────┘
Langkah 1: Konfigurasi Database di .env
Buka file .env di root project kamu, lalu sesuaikan konfigurasi database MySQL kamu:
Cuplikan kode
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_laravel13_todo
DB_USERNAME=root
DB_PASSWORD=
Langkah 2: Buat Model & Migration Task
Kita butuh satu tabel bernama tasks untuk menyimpan data Todo. Jalankan perintah Artisan berikut di terminal untuk membuat Model sekaligus file Migration-nya:
Bash
php artisan make:model Task -mBuka file migration di folder database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php, lalu lengkapi skema tabelnya seperti ini:
PHP
<?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('tasks', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->boolean('is_completed')->default(false);
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('tasks');
}
};
Selanjutnya, buka file Model app/Models/Task.php dan tambahkan properti $fillable agar kolom bisa diisi secara mass assignment:
PHP
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
use HasFactory;
protected $fillable = [
'title',
'is_completed',
];
}
Jalankan migrasi database dengan perintah:
Bash
php artisan migrateLangkah 3: Buat Controller & Logika CRUD
Sekarang buat controller untuk menangani alur logika data Todo App:
Bash
php artisan make:controller TaskControllerBuka file app/Http/Controllers/TaskController.php dan isi dengan kode berikut:
PHP
<?php
namespace App\Http/Controllers;
use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
// READ: Menampilkan daftar tugas
public function index()
{
$tasks = Task::latest()->get();
return view('tasks.index', compact('tasks'));
}
// CREATE: Menyimpan tugas baru
public function store(Request $request)
{
$request->validate([
'title' => 'required|max:255',
]);
Task::create([
'title' => $request->title,
]);
return redirect()->back()->with('success', 'Tugas berhasil ditambahkan!');
}
// UPDATE: Mengubah status selesai / belum
public function update(Task $task)
{
$task->update([
'is_completed' => !$task->is_completed,
]);
return redirect()->back()->with('success', 'Status tugas berhasil diperbarui!');
}
// DELETE: Menghapus tugas
public function destroy(Task $task)
{
$task->delete();
return redirect()->back()->with('success', 'Tugas berhasil dihapus!');
}
}
Langkah 4: Registrasi Routing Application
Buka file routes/web.php dan daftarkan route untuk mengarahkan request user ke TaskController:
PHP
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TaskController;
Route::get('/', [TaskController::class, 'index'])->name('tasks.index');
Route::post('/tasks', [TaskController::class, 'store'])->name('tasks.store');
Route::patch('/tasks/{task}', [TaskController::class, 'update'])->name('tasks.update');
Route::delete('/tasks/{task}', [TaskController::class, 'destroy'])->name('tasks.destroy');
Langkah 5: Buat Tampilan (Blade View)
Buat folder baru bernama tasks di dalam resources/views/, lalu buat file index.blade.php (resources/views/tasks/index.blade.php).
Untuk mempercantik tampilan secara instan, kita gunakan CDN Tailwind CSS:
HTML
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Laravel 13 - Todo App CRUD</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 min-h-screen py-10">
<div class="max-w-xl mx-auto bg-white p-6 rounded-lg shadow-md">
<h1 class="text-2xl font-bold text-gray-800 mb-6 text-center">Laravel 13 Todo App</h1>
<!-- Pesan Sukses -->
@if (session('success'))
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded mb-4">
{{ session('success') }}
</div>
@endif
<!-- Form Tambah Task (CREATE) -->
<form action="{{ route('tasks.store') }}" method="POST" class="flex gap-2 mb-6">
@csrf
<input type="text" name="title" placeholder="Ketik tugas baru..." required
class="flex-1 border border-gray-300 rounded px-3 py-2 focus:outline-none focus:border-blue-500">
<button type="submit" class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">
Tambah
</button>
</form>
<!-- Daftar Task (READ) -->
<ul class="divide-y divide-gray-200">
@forelse ($tasks as $task)
<li class="py-3 flex items-center justify-between">
<span class="{{ $task->is_completed ? 'line-through text-gray-400' : 'text-gray-800' }}">
{{ $task->title }}
</span>
<div class="flex items-center gap-2">
<!-- Toggle Status (UPDATE) -->
<form action="{{ route('tasks.update', $task->id) }}" method="POST">
@csrf
@method('PATCH')
<button type="submit" class="text-sm px-2 py-1 rounded {{ $task->is_completed ? 'bg-yellow-500 text-white' : 'bg-green-500 text-white' }}">
{{ $task->is_completed ? 'Batal' : 'Selesai' }}
</button>
</form>
<!-- Hapus Task (DELETE) -->
<form action="{{ route('tasks.destroy', $task->id) }}" method="POST" onsubmit="return confirm('Yakin ingin menghapus?')">
@csrf
@method('DELETE')
<button type="submit" class="text-sm bg-red-500 text-white px-2 py-1 rounded hover:bg-red-600">
Hapus
</button>
</form>
</div>
</li>
@empty
<li class="py-3 text-center text-gray-500">Belum ada tugas. Tambahkan sekarang!</li>
@endforelse
</ul>
</div>
</body>
</html>Uji Coba Aplikasi
Sekarang saatnya menjalankan aplikasi! Buka terminal dan jalankan server lokal:
Bash
php artisan serveBuka browser dan akses http://localhost:8000. Coba lakukan pengujian fitur berikut:
Tambah Data: Masukkan judul tugas lalu klik tombol Tambah.
Ubah Status: Klik tombol Selesai untuk menandai tugas tercoret.
Hapus Data: Klik tombol Hapus untuk menghapus baris tugas dari database.
Ringkasan & Langkah Selanjutnya
Selamat! Kamu sudah berhasil membuat aplikasi CRUD Todo App menggunakan Laravel 13 dan MySQL. Melalui tutorial ini, kamu telah mempelajari penggunaan Migration, Model, Controller, Routing, hingga integrasi Blade View.
Langkah selanjutnya: Kamu bisa mencoba menambahkan fitur validasi yang lebih kompleks, pagination, atau menambahkan fitur authentication menggunakan starter kit Laravel. Selamat mencoba!
Ditulis oleh
Egi Samsul Mu'arif
Web & Mobile Developer



