> PS: лучше код гляньте, скажите — правильная ли реализация или я что-то не учел или мог бы сделать лучше? Явных проблем не вижу, но есть два момента, из-за которых вы делаете два запроса вместо одного. %%(p) if (count($this->query) > 0) { %% Это может вызывать повторный запрос, т.е. внутри paginator будет делаться два запроса (нужно проверить). %%(p) $items = Article::filtered(); $total = $items->count(); ... $items = $items->skip(($page - 1) * $per_page)->take($per_page)->get(); %% Здесь вы вначале делаете запрос с COUNT, дальше без, но с LIMIT. А зачем первый запрос вообще нужен? Ведь вы после второй выборки уже имеете массив; если он пустой - значит, %%$page%% слишком велика и нужно выдавать 404 (по вашей логике). Нет смысла дополнительно вначале проверять общее число записей в таблице, это можно определить из второго запроса.