Три варіанти з різною ціною.
paginate() - номери сторінок і загальна кількість:
{ "data": [...], "meta": { "current_page": 3, "last_page": 120, "total": 2400 }, "links": {...} }
Ціна: додатковий COUNT(*) і OFFSET, що повільнішає з номером сторінки. Підходить для адмінок і невеликих таблиць, де потрібен перехід на сторінку N.
simplePaginate() - лише «далі/назад», без COUNT(*). Дешевше, але OFFSET лишається.
cursorPaginate() - курсор від останнього запису:
select * from posts where id > 1500 order by id limit 21
- однаково швидко на будь-якій глибині (з індексом на колонках сортування);
- не губить і не дублює записи, коли між запитами додаються нові;
- але немає номерів сторінок і загальної кількості, а сортування має бути за унікальною комбінацією колонок.
Для стрічок, нескінченного прокручування, синхронізації й вивантаження - курсор.
Що ще важливо в API:
- обмежити
per_pageзверху (min($request->integer('per_page', 20), 100)), інакше клієнт попросить мільйон; - стабільне сортування з
idостаннім ключем - інакше записи з однаковою датою «стрибають» між сторінками; - якщо загальна кількість потрібна на великій таблиці - кешувати її чи віддавати приблизну.
Докладніше в документації: Курсорна пагінація чи за зміщенням