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