paginate() робить два запити:
select count(*) as aggregate from posts where published = true; -- загальна кількість
select * from posts where published = true order by id desc limit 15 offset 30;
Завдяки кількості він знає, скільки всього сторінок, і може показати навігацію «1 2 3 ... 48» та «Показано 31-45 з 712».
simplePaginate() робить один запит і бере на один запис більше:
select * from posts where published = true order by id desc limit 16 offset 30;
Якщо повернувся 16-й запис - наступна сторінка існує. Загальної кількості він не знає, тому показує лише «Попередня» і «Наступна».
$posts = Post::where('published', true)->latest('id')->simplePaginate(15);
Порівняння:
paginate() |
simplePaginate() |
|
|---|---|---|
| запитів | 2 (з count) |
1 |
| номери сторінок | так | ні |
| загальна кількість | $posts->total() |
недоступна |
$posts->lastPage() |
так | ні |
| швидкість на великих таблицях | count(*) може бути дорогим |
швидше |
Коли обирати simplePaginate():
- стрічки й списки, де користувач гортає послідовно: новини, коментарі, історія дій;
- кнопка «Завантажити ще»;
- великі таблиці, де
count(*)зі складними умовами займає помітний час; - API для мобільних застосунків, яким номери сторінок не потрібні.
Коли paginate(): таблиці в адмінці, результати пошуку з переходом на конкретну сторінку, місця, де потрібно показати загальну кількість.
Третій варіант - cursorPaginate(): теж без загальної кількості, але замість offset використовує умову за ключем сортування - швидкий навіть на далеких сторінках. Але не дозволяє перейти на довільну сторінку.
Відображення однакове: {{ $posts->links() }} для обох; для простої пагінації Laravel використовує окремий шаблон лише з двома кнопками.