Pagerfanta\Doctrine\ORM\QueryAdapter for Eloquent).?page=2).paginate() is simpler but lacks flexibility (e.g., no support for non-DB sources like APIs or arrays). Pagerfanta fills this gap.pagerfanta/doctrine-orm-adapter) bridge the gap.pagerfanta/core (lightweight, ~1MB).doctrine/orm for Eloquent) may add complexity but are optional.Pagerfanta\Pagerfanta). Mockable adapters simplify TDD.limit/offset or cursor-based adapters).pagerfanta/doctrine-orm-adapter with ORDER BY id) required?DB::enableQueryLog().)currentPage, lastPage)?Pagerfanta\Doctrine\ORM\QueryAdapter to wrap Model::query().Pagerfanta\Pagerfanta with raw SQL via DB::select().Guzzle for remote data pagination.paginate(): Prefer for simple cases (e.g., User::paginate(10)).X-Pagination-Current-Page).GET /api/users) with Pagerfanta.paginate().doctrine-orm-adapter for Eloquent).PaginationService class to standardize usage.links, meta).deprecated() helper.composer require pagerfanta/core:^3.0 for LTS stability.OFFSET-FETCH may require adapter tweaks.vue-paginate) support Pagerfanta’s response format:
{
"data": [...],
"meta": {
"current_page": 1,
"last_page": 5
}
}
PaginationAdapter facade to abstract adapter logic:
// app/Services/PaginationAdapter.php
class PaginationAdapter {
public static function createFromQueryBuilder(Builder $query): Pagerfanta {
return new Pagerfanta(new QueryAdapter($query));
}
}
pagerfanta/core and adapter repos for breaking changes.composer why-not pagerfanta/core:^4.0 to test upgrades.maxPerPage defaults).explain analysis).public function testPaginationWithEmptyResults() {
$pager = new Pagerfanta(new ArrayAdapter([]), 10);
$this->assertEquals(0, $pager->getNbResults());
}
->debug() to Laravel’s query log.getResults() returns iterable data.tntsearch/tntsearch for full-text pagination.spatie/laravel-query-builder for complex query building.BabDev/Pagerfanta or fork if critical.maxPerPage values (e.g., 1000) may hit RAM limits. Cap at 50–100.ORDER BY created_at) to avoid full scans.cache()->remember() if data is static:
return cache()->remember("users_page_{$page}", now()->addHours(1), function() use ($pager) {
return $pager->getCurrentPageResults();
});
| Failure | Impact | Mitigation |
|---|---|---|
Unbounded maxPerPage |
OOM crashes | Set default maxPerPage = 50 in config. |
| Slow offset queries | API timeouts | Use cursor-based pagination or limit/offset tweaks. |
| Adapter misconfiguration | Empty/incomplete results | Validate adapter inputs (e.g., count()). |
| Frontend misalignment | Broken pagination UI | Standardize API response format. |
| Database connection loss | Broken queries | Retry logic with DB::reconnect(). |
Pagerfanta and Adapter interfaces.paginate() with Pagerfanta in a sample endpoint.How can I help you explore Laravel packages today?