Iman Sugirman

Sequelize Pagination dan Filter di Nodejs

30 Desember 2022

Sequelize ORM menggunakan Filter dan Pagination lebih mudah dan lebih efisien untuk menghandle dan integrasi dengan Table di Front end, biasanya hal ini sangat menyulitkan karena Sequelize ini tidak menyajikan langsung dengan pagination dan filter di library bawaannya.

Pertama buat class terlebih dahulu untuk mengextract limit dan offset seperti ini :

// pagination.js const getPagination = (page, size) => { const limit = size ? +size : 10; const offset = page ? page * limit : 0; return { limit, offset }; };

Penjelasan diatas adalah :

const limit = size ? +size : 10;

diatas menjelaskan request dari front end misal size itu direquest adalah 10 maka limit yang akan dikirim dari server adalah 10

const offset = page ? page * limit : 0;

Offset diatas adalah yang akan di skip, yg mana fungsi skip ini akan dilewati berapa data yang tidak akan kita query.

Lalu untuk extraksi data dan menggabungkannya dengan pagination bisa menggunakan seperti ini :

const getPagingData = (models, page, limit) => { const { count: total, rows: data } = models; const currentPage = page ? +page : 0; const currentPageFront = page ? +page + Number(1) : Number(1); const totalPages = Math.ceil(total / limit - Number(1)); const totalPagesFront = Math.ceil(total / limit); return { data, pagination: { total, totalPages, totalPagesFront, currentPage, currentPageFront, }, }; };

Dan penjelasannya diatas adalah seperti ini :

const { count: total, rows: data } = models;

total adalah extraksi dari count data yang dikumpulkan. dan rows adalah data dari query yg dihasilkan.

const currentPage = page ? +page : 0;

untuk menentukan currentPage dibackend yang sedang di page tersebut kita buat parse seperti diatas. Untuk mengetahui posisi page sekarang.

const currentPageFront = page ? +page + Number(1) : Number(1);

untuk menentukan currentPageFront difrontend yang sedang di page tersebut kita buat parse seperti diatas. Untuk mengetahui posisi page sekarang.

const totalPages = Math.ceil(total / limit - Number(1));

untuk menentukan totalPages dibackend yang sedang di page tersebut kita buat parse seperti diatas. Untuk mengetahui posisi page sekarang.

const totalPagesFront = Math.ceil(total / limit);

untuk menentukan totalPagesFront difrontend yang sedang di page tersebut kita buat parse seperti diatas. Untuk mengetahui posisi page sekarang.

Parsing dari Controller untuk Mengekstrak Pagination

Untuk mempassing data dari controller ke Pagination class yang tadi kita buat:

const { getPagination, getPagingData } = require('../utils/pagination'); ... const page = req.query.page || 0; const size = req.query.size || 10; const search = req.query.search || ''; const { limit, offset } = getPagination(page, size);

Fungsi Filter dari Sequelize seperti berikut :

const { Op } = require('sequelize'); ... const condition = search ? { [Op.or]: { name: { [Op.iLike]: `%${search}%` }, }, } : null;

Selanjutnya kita buat pass data dari controller

const { Model } = require('../models'); const models = await Model.findAndCountAll({ attributes: ['id', 'name', 'created_at'], where: condition, order: sort, limit, offset, }); const response = getPagingData(models, page, limit); res.status(200).json(response);

Demikian tutorial Sequelize Pagination dan Filter di Nodejs, Happy Coding....