Mengatur Pagination Data Cepat Sederhana Mini Proyek Menggunakan Laravel 12: Tutorial Menampilkan Ribuan Data di Laravel Tanpa Lag

Dengan semakin bertambahnya jumlah data dalam aplikasi, kebutuhan untuk menampilkan informasi dengan cepat dan tetap ringan menjadi semakin penting. Laravel 12 sudah menyediakan beberapa fitur pagination yang efisien, namun banyak developer belum memaksimalkan penggunaannya.

Di mini proyek ini, kita akan fokus bagaimana cara menampilkan ribuan data secara mulus tanpa membuat server ngos-ngosan. Pendekatannya sederhana, langkah-langkahnya singkat, dan cocok banget buat kamu yang ingin memahami teknik optimasi dasar namun berdampak besar pada performa aplikasi.

Di bab ini, kita tidak hanya menggunakan pagination standar, tapi juga menjelajahi opsi pagination yang lebih cepat dan hemat resource seperti simple pagination dan cursor pagination. Semua dibahas dengan cara praktis sehingga mudah langsung dipraktikkan tanpa teori yang berbelit-belit.

Dengan mengikuti mini proyek ini, kamu akan melihat bagaimana perubahan satu baris kode saja bisa membuat pengalaman pengguna jauh lebih responsif saat menjelajahi banyak data di aplikasi Laravel.

Mari kita mulai membangun pondasi kecil ini untuk menciptakan aplikasi yang tetap cepat meski menghadapi jumlah data yang besar.

1. Buat Proyek Laravel Baru

Untuk memulai mini proyek ini dengan alur yang rapi, langkah pertama yang perlu kita lakukan adalah menyiapkan proyek Laravel baru sebagai fondasi sebelum masuk ke konfigurasi pagination.

laravel new pagination-bwa-tegar

Perintah “laravel new pagination-bwa-tegar” digunakan untuk membuat sebuah proyek Laravel baru dengan nama tersebut sehingga kita memiliki struktur aplikasi yang siap dipakai untuk melanjutkan proses pembuatan fitur pagination.

Pilih sebagai berikut

Setelah menunggu lama lanjut pilih sebagai berikut

Atau kalau pakai Composer:

composer create-project laravel/laravel pagination-bwa-tegar

Perintah “composer create-project laravel/laravel pagination-bwa-tegar” digunakan untuk membuat proyek Laravel baru menggunakan Composer, sehingga seluruh file dan dependensi Laravel terunduh otomatis dan siap digunakan sebagai dasar pengembangan fitur pagination.

Selanjutnya mulai masuk ke foldernya:

cd pagination-bwa-tegar/
code .

Hasil

Jalankan migrasi:

Selanjutnya buka terminal proyek kamu dan jalankan perintah ini

php artisan migrate
# Would you like to create it? (yes/no) [yes] Pilih Yes

Perintah “php artisan migrate” dijalankan untuk membuat seluruh tabel yang sudah didefinisikan dalam file migration agar database siap digunakan dalam proyek pagination ini.

🚨 Sebelum migrasi pastikan database/PhpMyAdmin kalian sudah aktif atau bisa di akses ya.

Hasil

Jalankan server:

Selanjutnya jalankan perintah ini

php artisan serve
# Lalu akses [<http://127.0.0.1:8000>]

Perintah “php artisan serve” digunakan untuk menjalankan server pengembangan Laravel sehingga aplikasi bisa langsung diakses melalui browser dan siap diuji selama proses pembuatan fitur pagination.

Hasil

2. Siapkan Database

Pada tahap ini, kita mulai menyiapkan database yang akan menjadi tempat penyimpanan data sehingga proses pagination dapat berjalan dengan baik dan terstruktur.

Buka file .env di proyek kamu, lalu sesuaikan bagian ini saja:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=pagination_bwa_tegar
DB_USERNAME=root
DB_PASSWORD=

Konfigurasi DB_CONNECTION hingga DB_PASSWORD tersebut digunakan untuk menghubungkan proyek Laravel ke database MySQL lokal sehingga aplikasi bisa menyimpan, membaca, dan menampilkan data yang nantinya akan dipaginasi.

Hasil

3. Buat Tabel & Model

Pada langkah ini, kita mulai membuat tabel dan model sebagai fondasi utama agar data yang akan dipaginasi memiliki struktur dan representasi yang jelas di dalam aplikasi.

Selanjutnya kita buat tabel dan modelnya pakai migration dan model di dalam terminal. Kita bikin tabel products untuk contoh data.

php artisan make:model Product -m

Perintah “php artisan make:model Product -m” digunakan untuk membuat model Product sekaligus file migration-nya agar kita bisa menyiapkan struktur tabel yang akan digunakan dalam proses pagination.

Hasil

Selanjutnya masuk ke hasil terminal tadi dan edit migration: database/migrations/xxxx_create_products_table.php

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->integer('price');
        $table->timestamps();
    });
}

Kode tersebut mendefinisikan struktur tabel products di database dengan kolom seperti id, name, price, dan timestamps, sehingga tabel ini siap digunakan untuk menyimpan data yang akan ditampilkan melalui pagination.

Hasil

Selanjutnya beralih ke dalam Model hasil terminal kita tadi juga. Yaitu isi app/Models/Product.php:

<?php

namespace App\\Models;

use Illuminate\\Database\\Eloquent\\Factories\\HasFactory;
use Illuminate\\Database\\Eloquent\\Model;

class Product extends Model
{
    use HasFactory;
}

Kode tersebut mendefinisikan model Product yang mewakili tabel products di database, sehingga kita dapat berinteraksi dengan data produk melalui fitur-fitur Eloquent termasuk pagination.

Bagian use HasFactory pada model tersebut berfungsi untuk mengaktifkan fitur factory sehingga kita bisa dengan mudah membuat data dummy dalam jumlah besar untuk keperluan testing dan pagination.

Lalu buka terminal kembali dan jalankan migrasi ulang:

php artisan migrate:fresh

Perintah “php artisan migrate:fresh” digunakan untuk menghapus seluruh tabel lalu menjalankan ulang semua migration dari awal, sehingga database kembali dalam kondisi bersih dan siap diisi data baru untuk pengujian pagination.

Hasil

4. Isi Data Banyak (Ribuan)

Pada tahap ini, kita mulai mengisi database dengan data dalam jumlah besar agar proses pagination dapat diuji secara nyata dan menunjukkan performanya saat menangani ribuan record.

Agar terasa real, kita pakai seeder.

4.1. Buat seeder:

php artisan make:seeder ProductSeeder

Perintah “php artisan make:seeder ProductSeeder” digunakan untuk membuat file seeder yang akan kita pakai untuk mengisi tabel produk dengan data dalam jumlah besar secara otomatis.

Hasil

Selanjutnya isi database/seeders/ProductSeeder.php:

use App\\Models\\Product;
use Illuminate\\Database\\Seeder;

class ProductSeeder extends Seeder
{
    public function run()
    {
        Product::factory()->count(5000)->create();
    }
}

Kode tersebut menjalankan factory milik model Product untuk membuat 5.000 data produk secara otomatis, sehingga database terisi dengan data besar yang diperlukan untuk menguji fitur pagination.

Hasil

4.2. Buat factory:

Selanjutnya kita buat factory

php artisan make:factory ProductFactory --model=Product

Perintah “php artisan make:factory ProductFactory --model=Product” digunakan untuk membuat file factory yang akan menentukan pola pembuatan data dummy agar proses pengisian ribuan data produk bisa dilakukan secara otomatis dan konsisten.

Hasil

Lanjutkan dengan isi database/factories/ProductFactory.php:

use Illuminate\\Database\\Eloquent\\Factories\\Factory;

class ProductFactory extends Factory
{
    public function definition()
    {
        return [
            'name' => $this->faker->words(3, true),
            'price' => $this->faker->numberBetween(10000, 500000),
        ];
    }
}

Kode tersebut mendefinisikan pola pembuatan data palsu untuk model Product, sehingga setiap data yang dihasilkan factory memiliki nama dan harga acak yang realistis untuk keperluan pagination.

Hasil

Selanjutnya buka terminal dan jalankan seeder:

php artisan db:seed --class=ProductSeeder

Perintah “php artisan db:seed --class=ProductSeeder” digunakan untuk menjalankan seeder yang telah dibuat sehingga ribuan data produk otomatis dimasukkan ke dalam database untuk kebutuhan pengujian pagination.

Hasil

5. Buat Controller

Pada tahap ini, kita mulai membuat controller sebagai tempat mengatur logika untuk mengambil, mengolah, dan menampilkan data yang akan dipaginasi.

Jalankan perintah ini di terminal:

php artisan make:controller ProductController

Perintah “php artisan make:controller ProductController” digunakan untuk membuat controller baru yang akan menampung logika pengambilan dan penampilan data produk beserta pagination-nya.

Hasil

Selanjutnya bisa di susul dengan isi app/Http/Controllers/ProductController.php:

use App\\Models\\Product;

class ProductController extends Controller
{
    public function index()
    {
        // Pagination cepat (15 per halaman)
        $products = Product::orderBy('id', 'desc')->paginate(15);

        return view('products', compact('products'));
    }
}

Kode tersebut mengambil data produk dari database secara berurutan menggunakan pagination lalu mengirimkannya ke view products agar dapat ditampilkan per halaman.

Hasil

6. Buat Route

Pada langkah ini, kita mulai mendefinisikan rute yang akan menghubungkan permintaan dari browser ke controller sehingga data produk yang dipaginasi bisa ditampilkan di halaman.

Maka beralih dan edit routes/web.php:

use App\\Http\\Controllers\\ProductController;

Route::get('/', [ProductController::class, 'index']);

Kode tersebut mendefinisikan rute utama yang akan memanggil method index pada ProductController, sehingga halaman utama aplikasi langsung menampilkan data produk yang dipaginasi.

Hasil

7. Buat View untuk Menampilkan Data

Pada tahap ini, kita mulai membuat tampilan yang akan menampilkan data produk beserta navigasi pagination agar pengguna dapat melihat hasilnya langsung di browser.

Buat file resources/views/products.blade.php:

<!DOCTYPE html>
<html>
<head>
    <title>Pagination Demo</title>
    <link rel="stylesheet" href="<https://cdn.jsdelivr.net/npm/tailwindcss/dist/tailwind.min.css>">
</head>
<body class="p-8">

    <h1 class="text-2xl font-bold mb-4">Daftar Produk</h1>

    <table class="table-auto w-full border">
        <thead>
            <tr>
                <th class="border px-4 py-2">ID</th>
                <th class="border px-4 py-2">Nama</th>
                <th class="border px-4 py-2">Harga</th>
            </tr>
        </thead>
        <tbody>
            @foreach($products as $item)
            <tr>
                <td class="border px-4 py-2">{{ $item->id }}</td>
                <td class="border px-4 py-2">{{ $item->name }}</td>
                <td class="border px-4 py-2">{{ $item->price }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>

    <div class="mt-4">
        {{ $products->links() }}
    </div>

</body>
</html>

Kode tampilan tersebut menyusun struktur halaman sederhana yang berisi tabel untuk menampilkan daftar produk lengkap dengan ID, nama, dan harga, lalu di bagian bawahnya disertakan navigasi pagination otomatis dari Laravel.

Dengan memanfaatkan Tailwind CSS melalui CDN, tampilan halaman menjadi rapi dan nyaman dilihat tanpa perlu menulis banyak CSS manual, sehingga pengguna dapat langsung melihat hasil paginasi data dengan jelas dan responsif.

Hasil

8. Cek di Browser

Pada langkah ini, kita mulai membuka hasil pengerjaan kita di browser untuk memastikan pagination bekerja dengan benar dan seluruh data tampil sesuai yang diharapkan.

Jalankan terminal

php artisan serve
# Lalu akses <http://127.0.0.1:8000/>

Boom! 🎉

Data ribuan tampil mulus dengan pagination Laravel bawaan.

Hasil

9. (Opsional Tapi Mantap) Gunakan Pagination Lebih Cepat

Pada tahap ini, kita mulai meningkatkan performa dengan mencoba opsi pagination yang lebih cepat agar proses penampilan data menjadi jauh lebih ringan dan responsif.

Jika ingin super cepat untuk dataset sangat besar:

$products = Product::orderBy('id', 'desc')->simplePaginate(15);

Kode tersebut menggunakan simplePaginate(15) untuk menampilkan data per halaman tanpa perhitungan total, sehingga proses pagination menjadi lebih ringan dan cepat.

Bedanya:

  • Tidak menghitung total data (jadi query lebih ringan)
  • Tidak ada nomor halaman detail (cuma Next / Previous)

CARA PAKAINYA?

Kamu hanya perlu mengganti 1 baris di controller. Udah, selesai. 😄

Caranya buka app/Http/Controllers/ProductController.php

$products = Product::orderBy('id', 'desc')->paginate(15);

# ubah menjadi

$products = Product::orderBy('id', 'desc')->simplePaginate(15);

Hasil

Atau pagination untuk API:

$products = Product::cursorPaginate(15);

Kode tersebut menggunakan cursorPaginate(15) untuk menampilkan data per halaman dengan performa paling cepat karena pagination berbasis cursor yang tidak membutuhkan perhitungan total data.

Apa itu cursor pagination?

  • Tidak menghitung total data → super ringan
  • Tidak ada page number → pakai cursor sebagai penanda posisi
  • Cepat banget untuk data ribuan–jutaan
  • Query jauh lebih hemat daripada paginate biasa

Caranya buka app/Http/Controllers/ProductController.php

$products = Product::orderBy('id', 'desc')->paginate(15);
# atau
$products = Product::orderBy('id', 'desc')->simplePaginate(15);

# Menjadi

$products = Product::orderBy('id', 'desc')->cursorPaginate(15);

Hasil

10. Tambahkan Fitur Search ke Pagination

Dengan menambahkan fitur search ke pagination, kamu akan membawa pengalaman pengguna ke level yang jauh lebih nyaman karena mereka bisa langsung menemukan data yang mereka butuhkan tanpa harus menelusuri halaman satu per satu.

Fitur ini bekerja dengan cara menggabungkan query pencarian dengan hasil pagination, sehingga setiap kata kunci yang dimasukkan tetap dipertahankan saat berpindah halaman. Alhasil, alur pengelolaan data jadi lebih cepat, lebih presisi, dan terasa jauh lebih profesional layaknya aplikasi produksi sungguhan.

10.1 Tambah Input Search di View (resources/views/products.blade.php)

Langkah ini dimulai dengan menambahkan sebuah input search langsung di tampilan agar pengguna bisa mengetik kata kunci pencarian sebelum datanya difilter dan ditampilkan ulang dengan rapi melalui pagination.

Tambahkan tepat di atas tabel:

<form method="GET">
    <input type="text"
           name="search"
           placeholder="Cari produk..."
           value="{{ request('search') }}"
           class="border px-3 py-2 mb-4">
</form>

Hasil

10.2 Update Controller untuk Menangani Search

Pada tahap ini, kamu cukup menyesuaikan controller agar bisa membaca kata kunci dari input search dan otomatis memfilter data sebelum dipaginate.

Edit ProductController → method index() menjadi:

public function index(Request $request)
{
    $query = Product::orderBy('id', 'desc');

    if ($request->search) {
        $query->where('name', 'like', '%' . $request->search . '%');
    }

    $products = $query->paginate(15)->appends(['search' => $request->search]);

    return view('products', compact('products'));
}

Hasil

10.3 Pastikan Route Sudah Benar

Di langkah ini, kamu hanya perlu memastikan bahwa route yang memanggil controller sudah menggunakan method index yang sama sehingga fitur search dan pagination bisa berjalan mulus tanpa konflik.

(Tidak perlu diubah jika masih seperti ini)

Route::get('/', [ProductController::class, 'index']);

10.4 Test di Browser

Pada tahap ini, kamu tinggal membuka browser dan mencoba fitur search yang baru saja dibuat untuk memastikan semuanya bekerja sesuai harapan.

Mulai dari pencarian kata kunci, perpindahan halaman, hingga hasil yang tetap konsisten saat kamu berpindah halaman berikutnya.

Coba ketik beberapa nama produk, gabungkan dengan pagination, lalu lihat apakah hasilnya tetap terfilter rapi, kalau semuanya tampil sesuai input kamu, berarti fitur search + pagination sudah terintegrasi dengan sempurna!

Kunjungi:

<http://127.0.0.1:8000>

Atau ketik langsung di input search di halaman.

Hasil

🚀 Selesai!

Keren banget, sampai di tahap ini, seluruh fitur inti mulai dari menampilkan data, pagination cepat, hingga search yang mulus sudah berhasil kamu bangun, dan aplikasimu kini terasa jauh lebih profesional serta nyaman digunakan!

Kamu sudah melalui langkah demi langkah yang biasanya dianggap ribet oleh banyak developer pemula, tapi sekarang semua alurnya jadi jelas, ringan, dan rapi. Ini adalah fondasi kuat untuk fitur-fitur keren berikutnya, jadi kamu tinggal lanjut improvisasi, upgrade, dan kembangkan aplikasimu tanpa batas!

Search sekarang sudah berjalan bareng pagination, dan link pagination tetap mempertahankan keyword pencarian karena sudah memakai ->appends().

11. SELESAI !

Mini project kamu sudah jalan 100% yaitu dari setup project → buat data ribuan → paginasi → tampil tanpa lag.

12. Rekomendasi Kelas Terbaik & Terbaru (Wajib Ikut!)

🚀 12.1. Kelas Ebook Laravel 12: Bikin Web Manajemen Gudang dan Point of Sale

Berikut Linknya: https://buildwithangga.com/kelas/ebook-laravel-12-bikin-web-manajemen-gudang-dan-point-of-sale?main_leads=searchsuggestion

🔥 Kelas terbaru, paling up-to-date, dan dirancang khusus berdasarkan kebutuhan industri saat ini!

Di kelas ini, kamu tidak hanya belajar teori, tetapi benar-benar dibimbing membuat aplikasi lengkap yang dipakai di banyak bisnis modern. Kelas ini adalah paket komplit untuk membangun pondasi Laravel kamu ke level profesional, karena di dalamnya kamu akan belajar:

12.1.1. Membangun Sistem Manajemen Gudang dari Nol

Mulai dari struktur database, pencatatan barang, mutasi stok, hingga laporan yang bisa dipahami tim operasional.

12.1.2. Membuat Sistem Point of Sale (POS) Modern

Lengkap dengan:

  • transaksi real-time
  • pengurangan stok otomatis
  • hingga invoice siap cetak

persis seperti aplikasi yang dipakai minimarket dan retail.

12.1.3. Workflow Bisnis Industri Nyata

Kamu bakal paham cara kerja gudang dan toko modern yang itu sesuatu yang jarang diajarkan di kelas lain.

12.1.4. Laravel 12 (Versi Terbaru)

Kamu belajar langsung menggunakan fitur terbaru Laravel biar langsung siap kerja.

12.1.5. Studi Kasus Lengkap & Aplikatif

Bukan teori, tapi benar-benar membangun aplikasi yang bisa kamu pakai dan jadikan portofolio premium.

12.1.6. Cocok untuk Developer Pemula hingga Menengah

Materi dirangkai bertahap, jelas, dan mudah diterapkan.

13. Penutup

Sebagai penutup, kalau kamu ingin benar-benar naik level dan menguasai Laravel 12 secara terstruktur, praktis, dan langsung bisa dipakai untuk dunia kerja maupun proyek nyata, aku sangat menyarankan kamu lanjut belajar melalui kelas paling komprehensif dan terbaru yang baru saja dirilis, yaitu Kelas Ebook Laravel 12 – Bikin Web Manajemen Gudang dan Point of Sale (POS).

Kelas ini dirancang sebagai panduan lengkap dari nol sampai mahir, membawamu memahami alur pembuatan aplikasi skala bisnis dengan fitur yang dipakai di perusahaan sungguhan, mulai dari pengelolaan stok, transaksi kasir, laporan harian, hingga workflow manajemen gudang yang efisien.

Di dalam kelas tersebut, kamu akan belajar langkah demi langkah yang runtut, jelas, dan mendalam, mulai dari struktur database, autentikasi modern, desain arsitektur rapi, optimasi performa, hingga praktik coding standar industri.

Setiap modul disusun sangat detail agar kamu tidak hanya tahu caranya, tapi juga memahami kenapa sebuah teknik digunakan. Yang paling menarik, kelas ini menggunakan Laravel 12 versi terkini, sehingga materi benar-benar up to date dan siap dipakai untuk kebutuhan produksi.

Kalau kamu ingin menangani proyek web profesional, membuka jasa pembuatan aplikasi, atau bahkan membangun bisnis Point of Sale sendiri, kelas ini adalah investasi belajar terbaik yang bisa kamu ambil sekarang juga.