Pluginify

Masuk Daftar
Home > Blog > Tutorial > Tutorial CRUD & Pagination dari Nol

Tutorial CRUD & Pagination dari Nol

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.

Pluginify
Pluginify