Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Junior: питання на співбесіді з теми «Пагінація»

Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.

2 питання

Достатньо викликати paginate() замість get() - Laravel сам читає номер сторінки з query-параметра ?page=:

$posts = Post::latest()->paginate(15);
@foreach ($posts as $post) ... @endforeach
{{ $posts->links() }}   {{-- кнопки навігації --}}
  • paginate() рахує загальну кількість (показує «сторінка X з Y»).
  • simplePaginate() - лише «вперед/назад», без COUNT(*), швидше на великих таблицях.
  • cursorPaginate() - курсорна пагінація, найефективніша для нескінченного скролу.

Докладніше в документації: Пагінація

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 використовує окремий шаблон лише з двома кнопками.

Докладніше в документації: Проста пагінація