Membuat Pagination Secara Manual


Laravel punya package pagination yang terintegrasi dengan Eloquent (pangkalan data), serta secara bawaan menggunakan template berbasis Bootstrap. Cukup dengan menambahkan method paginate() pada Eloquent, dan boom! pagination akan diatur secara otomatis oleh Laravel.

public function index()
{
    $users = \App\User::paginate();

    return view('user.index', compact('users'));
}

Kemudian, untuk menampilkan tautan pagination, kalian cukup menambahkan skrip $users->links() di view. Begitu mudah kan?

Contoh Kasus

Namun, suatu waktu, bisa jadi kalian tidak menggunakan pagination bersamaan dengan data Eloquent. Di kasus tertentu, bisa saja membuat paginatian dari sekumpulan array atau object yang didapat dari sumber luar, dari API misalnya.

Laravel sudah menyediakan contoh sederhananya melalui dokumentasi pada tautan berikut. Untuk lebih jelasnya, mari kita buat langkah demi langkah.

Data

Saya punya contoh data seperti berikut, tipe datanya adalah array. Jika kalian punya data yang berbentuk JSON, kalian bisa mengkonversinya dulu ke dalam bentuk array atau object menggunakan fungsi json_decode() kemudian mengkonversinya menjadi Laravel collection menggunakan method collect().

[
  {
    "id": 1,
    "title": "Membuat Aplikasi itu Mudah"
  },
  {
    "id": 2,
    "title": "Teknik Dasar dalam Pemrograman"
  },
  {
    "id": 3,
    "title": "Belajar Framework PHP: Laravel"
  }
]

Hal pertama yang dilakukan dari data di atas adalah menghitung jumlah datanya menggunakan method count().

// konversi dari json menjadi array
$result = json_decode($json);

// konversi menjadi collection dan hitung jumlah data
$article = collect($result);
$total = $article->count();

Membuat Pagination

Data beserta jumlahnya sudah didapat, langkah selanjutnya adalah membuat pagination secara manual menggunakan class LengthAwarePaginator. Impor class tersebut pada controller di mana kalian akan menggunakan pagination.

use use Illuminate\Pagination\LengthAwarePaginator;

Sebelum pagination di-generate, tentukan terlebih dahulu current page pagination serta data jumlah data yang akan ditampilkan per halaman. Langkah selanjutnya, meng-generate pagination menggunakan class LengthAwarePaginator.

// set current page
$currentPage = LengthAwarePaginator::resolveCurrentPage();

// set limit 
$perPage = 20;

// generate pagination
$currentResults = $article->slice(($currentPage - 1) * $perPage, $perPage)->all();
$results = new LengthAwarePaginator($currentResults, $article->count(), $perPage);

Adapun skrip lengkap dapat dilihat pada potongan skrip di bawah:

public function index()
{
    // json data
    $json = '...';
    $article = collect(json_decode($json));

    // pagination
    $currentPage = LengthAwarePaginator::resolveCurrentPage();
    $perPage = 50;

    $currentResults = $article->slice(($currentPage - 1) * $perPage, $perPage)->all();
    $results = new LengthAwarePaginator($currentResults, $article->count(), $perPage);

    return view('article.index', [
        'results' => $results,
    ]);
}

Menampilkan Tautan Pagination

Terakhir, tampilkan tautan pagination pada view dengan skrip $results->links().

Perlu diperhatikan, ketika menggunakan manual pagination menggunakan class LenghAwarePaginator, kalian harus mengatur path secara mandiri menggunakan method withPath(). Method ini dapat digunakan pada view maupun pada controller.

Sebagai contoh, kalian punya mendefinisikan route untuk controller di atas adalah sebagai berikut:

Route::get('article/index', 'ArticleController@index');

Maka, penggunaan method withPath() adalah sebagai berikut:

$results->withPath('article/index')->links();

Class “LengthAwarePaginator” dan “Paginator”

Dalam pagination Laravel, kita mengenal dua method (yang menggunakan dua class berbeda), yaitu paginate() dan simplePaginate(). Ketika menggunakan simplePaginate(),  beberapa method tidak tersedia untuk digunakan, seperti lastPage() dan total().

Dalam membuat pagination secara manual, kita dihadapkan pada dua class yang berbeda pula, yaituLengthAwarePaginatordanPaginator. Penggunaan kedua class tersebut disesuaikan dengan kebutuhan aplikasi yang kalian bangun.

Di mana letak perbedaannya?

Class Paginator tidak membutuhkan jumlah data dari result set. Oleh karenanya, kita tidak bisa menggunakan method total() dan lastPage() pada pagination yang menggunakan classPaginator. Berbeda dengan class LengthAwarePaginatoryang membutuhkan jumlah data seperti pada contoh skrip di atas.

Sederhannya, classLengthAwarePaginatormerupakan alias dari method paginate(), sedangkan classPaginatormerupakan alias dari simplePaginate().

Pertanyaan selanjutnya, kapan menggunakan paginate() dan kapan menggunakan simplePaginate()?

Nah, untuk menjawab pertanyaan di atas, kalian bisa membaca sebuah artikel dengan judul Optimizing Laravel 5 & MySQL for 9M+ rows. 😉

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

2 comments

Tinggalkan Balasan