Tutorial CRUD & Pagination dari Nol
CRUD (Create, Read, Update, Delete) merupakan fondasi utama dalam hampir semua aplikasi berbasis database. Untuk menjaga performa aplikasi saat data semakin banyak, CRUD perlu dikombinasikan dengan pagination agar proses pengambilan data tetap efisien.
Pada tutorial ini, kita akan membahas cara membangun sistem CRUD lengkap dengan pagination dari nol, menggunakan pendekatan yang rapi, aman, dan mudah dikembangkan.
Konsep CRUD & Pagination
Sebelum masuk ke implementasi, pahami dulu konsep dasarnya:
- Create: Menyimpan data baru ke database
- Read: Menampilkan data dari database
- Update: Memperbarui data yang sudah ada
- Delete: Menghapus data
- Pagination: Membagi data dalam beberapa halaman
Pagination sangat penting untuk mencegah loading data berlebihan yang dapat menurunkan performa.
Struktur Project Sederhana
app/ ├── Http/ │ └── Controllers/ │ └── PostController.php ├── Models/ │ └── Post.php resources/ ├── views/ │ └── posts/ │ ├── index.blade.php │ ├── create.blade.php │ └── edit.blade.php routes/ └── web.php
Struktur ini memisahkan controller, model, dan view agar lebih terorganisir.
Routing CRUD
Route::resource('posts', PostController::class);
Satu baris route ini sudah mencakup seluruh operasi CRUD.
Menampilkan Data dengan Pagination (Read)
public function index()
{
$posts = Post::latest()->paginate(10);
return view('posts.index', compact('posts'));
}
Pagination membatasi jumlah data per halaman agar query tetap ringan.
Contoh di view:
@foreach($posts as $post)
<p>{{ $post->title }}</p>
@endforeach
{{ $posts->links() }}
Menambah Data (Create)
Form Input
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<input type="text" name="title" placeholder="Judul">
<textarea name="content" placeholder="Konten"></textarea>
<button type="submit">Simpan</button>
</form>
Proses Simpan
public function store(Request $request)
{
$request->validate([
'title' => 'required|min:3',
'content' => 'required',
]);
Post::create($request->all());
return redirect()->route('posts.index')
->with('success', 'Data berhasil ditambahkan');
}
Mengubah Data (Update)
Form Edit
<form action="{{ route('posts.update', $post->id) }}" method="POST">
@csrf
@method('PUT')
<input type="text" name="title" value="{{ $post->title }}">
<textarea name="content">{{ $post->content }}</textarea>
<button type="submit">Update</button>
</form>
Proses Update
public function update(Request $request, Post $post)
{
$request->validate([
'title' => 'required',
'content' => 'required',
]);
$post->update($request->all());
return redirect()->route('posts.index')
->with('success', 'Data berhasil diperbarui');
}
Menghapus Data (Delete)
<form action="{{ route('posts.destroy', $post->id) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit"
onclick="return confirm('Yakin ingin menghapus data ini?')">
Hapus
</button>
</form>
public function destroy(Post $post)
{
$post->delete();
return back()->with('success', 'Data berhasil dihapus');
}
Optimasi Pagination
Beberapa tips agar pagination tetap optimal:
Post::select('id', 'title')
->latest()
->paginate(10);
- Ambil kolom yang dibutuhkan saja
- Gunakan indexing di database
- Hindari
->get()tanpa pagination untuk data besar
Keamanan CRUD
Pastikan CRUD aman untuk production:
- Validasi input
- Proteksi CSRF
- Batasi akses dengan middleware
- Gunakan policy atau role
- Hindari mass assignment tanpa
$fillable
Contoh di model:
protected $fillable = ['title', 'content'];
Penutup
CRUD dengan pagination adalah fondasi dari hampir semua dashboard dan aplikasi web. Dengan struktur yang rapi, validasi yang baik, serta pagination yang optimal, aplikasi dapat tetap stabil dan scalable meskipun data terus bertambah.
Tutorial ini dapat dikembangkan lebih lanjut dengan fitur pencarian, filter data, soft delete, hingga REST API.