Skip to main content

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. Alt text

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

Jangan Lakukan Hal Ini

Sebelum masuk ketahap optimasi perlu adanya pengecekan ulang pada property $with dan $appends. Berikut poin-poin yang harus diperhatikan:

  1. Jangan menggunakan $with pada level Model. Pakailah pada level Service.
  2. 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);
    }
  3. Jangan tampilkan attribute yang tidak diperlukan pada index. Untuk melihat attribute apa-apa saja yang tampil dicek pada property $hiddenOnList atau method addAdditionalFieldSpec.

Optimasi

Berikut tahap-tahap yang dapat mengoptimasi API list menggunakan fungsi afterPaginate() pada service.

  1. Hapus property $with dan $appends.

     // protected $with = [
    // 'kpt120',
    // ];

    // protected $appends = [
    // 'status_badge',
    // 'case_name',
    // 'letter_no',
    // 'admin_satgas',
    // 'satgas',
    // 'satgas_members',
    // ];
  2. Perhatikan hasil dari query_in_loop, model yang ditampilkan adalah KPT150 bukan KPT151. Sehingga mau tidak mau kita harus mengoptimasi menggunakan cara seperti ini. Untuk sekarang kita kasih komentar pada property $appends pada model KPT150. Alt text

     // protected $appends = [
    // 'letter_no',
    // 'case_name',
    // 'status_badge',
    // 'satgas_members',
    // 'admin_satgas',
    // ];
  3. Berikut hasil dengan memodifkasi property $with dan $appends. Alt text

  4. 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;
    }
  5. 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;
    }
  6. Dengan besar data yang dipangkas menjadi 12 ribu baris dan waktu 2 detik. Alt text

  7. 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;
    }