Fungsi After Paginate
Pada service memiliki fungsi afterPaginate() yang bisa di-override untuk mengkostumisasi data yang akan tampil.
Tujuan
afterPaginate() ada untuk mengatasi masalah performansi API list yang memakan banyak resource sehingga proses yang diperlukan membutuhkan waktu yang lama dan hasil yang diberikan juga besar.
📝 Fungsi ini juga untuk membatasi penggunanaan property $with dan $appends pada Model.
Implementasi
API list KPM151
Kita ambil contoh kasus pada API list KPM151 dengan menghit API /api/kpm151/kpt151.
Membutuhkan waktu setidaknya 3 detik jika diakses melalui local dan jumlah query_in_loop yang lumayan banyak.

Tidak hanya itu, akan tetapi besar data yang dari API tersebut bisa mencapai lebih dari 30 ribu baris

Jangan Lakukan Hal Ini
Sebelum masuk ketahap optimasi perlu adanya pengecekan ulang pada property $with dan $appends. Berikut poin-poin yang harus diperhatikan:
- Jangan menggunakan
$withpada level Model. Pakailah pada level Service. - Jangan mendaftarkan attribute yang memiliki relasi didalamnya. Berikut contoh attribute yang jangan didaftarkan pada property
$appends.protected function letterNo(): Attribute
{
return Attribute::make(fn() => $this->kpt16a?->letter_no);
} - Jangan tampilkan attribute yang tidak diperlukan pada index. Untuk melihat attribute apa-apa saja yang tampil dicek pada property
$hiddenOnListatau methodaddAdditionalFieldSpec.
Optimasi
Berikut tahap-tahap yang dapat mengoptimasi API list menggunakan fungsi afterPaginate() pada service.
Hapus property
$withdan$appends.// protected $with = [
// 'kpt120',
// ];
// protected $appends = [
// 'status_badge',
// 'case_name',
// 'letter_no',
// 'admin_satgas',
// 'satgas',
// 'satgas_members',
// ];Perhatikan hasil dari
query_in_loop, model yang ditampilkan adalahKPT150bukanKPT151. Sehingga mau tidak mau kita harus mengoptimasi menggunakan cara seperti ini. Untuk sekarang kita kasih komentar pada property$appendspada modelKPT150.
// protected $appends = [
// 'letter_no',
// 'case_name',
// 'status_badge',
// 'satgas_members',
// 'admin_satgas',
// ];Berikut hasil dengan memodifkasi property
$withdan$appends.
Override fungsi
afterPaginate()dan lakukan transform pada data yang ingin diolah.protected function afterPaginate(LengthAwarePaginator $data): LengthAwarePaginator
{
$data->getCollection()->transform(function ($elm) {
return $elm;
});
return $data;
}Hal yang pertama dilakukan adalah memanggil ulang attribute pada fungsi
transform().protected function afterPaginate(LengthAwarePaginator $data): LengthAwarePaginator
{
$data->getCollection()->transform(function ($elm) {
$elm->setAppends(['status_badge', 'case_name', 'letter_no', 'satgas', 'admin_satgas', 'satgas_members']);
return $elm;
});
return $data;
}Dengan besar data yang dipangkas menjadi 12 ribu baris dan waktu 2 detik.

Gunakan
makeHidden()untuk menghilangkan attribute-attribute yang tidak dibutuhkan.protected function afterPaginate(LengthAwarePaginator $data): LengthAwarePaginator
{
$data->getCollection()->transform(function ($elm) {
$elm->makeHidden(['satgasMembersRelation', 'user', 'kpt150', 'kpt640a', 'pasal', 'people_involved', 'people_reported']);
$elm->setAppends(['status_badge', 'case_name', 'letter_no', 'satgas', 'admin_satgas', 'satgas_members']);
return $elm;
});
return $data;
}