Illustra la funzionalità di paginazione di Laravel. Copre le differenze tra paginate(), simplePaginate() e cursorPaginate(), la visualizzazione in Blade, la risposta API e la personalizzazione degli URL.
La paginazione di Laravel è integrata con Query Builder ed Eloquent ORM e si può usare senza configurazioni. La pagina corrente viene letta automaticamente dal parametro di query page della richiesta HTTP e aggiunta automaticamente ai link generati.L’HTML predefinito è compatibile con Tailwind CSS; puoi scegliere anche Bootstrap CSS.
Se non ti serve mostrare “elemento N di M totali”, scegli simplePaginate(). paginate() esegue una query COUNT(*) aggiuntiva, quindi simplePaginate() è più veloce.
La paginazione a cursore usa una clausola WHERE al posto di OFFSET, offrendo prestazioni elevate su grandi volumi di dati. Particolarmente adatta a UI a scroll infinito.
// orderBy è obbligatorio$users = DB::table('users')->orderBy('id')->cursorPaginate(15);$users = User::where('active', true)->cursorPaginate(15);
Gli URL generati contengono una stringa di cursore invece del numero di pagina.
-- paginate() / simplePaginate() — usa OFFSETSELECT * FROM users ORDER BY id ASC LIMIT 15 OFFSET 15;-- cursorPaginate() — usa una clausola WHERE (l'indice viene sfruttato)SELECT * FROM users WHERE id > 15 ORDER BY id ASC LIMIT 15;
La paginazione a cursore sfrutta gli indici in modo efficace e riduce il rischio di duplicazioni o omissioni di record anche in presenza di inserimenti e cancellazioni frequenti. Non genera però link ai singoli numeri di pagina: solo “precedente” e “successivo”.
<div class="container"> @foreach ($users as $user) <p>{{ $user->name }}</p> @endforeach</div>{{-- Emette i link di paginazione (compatibili con Tailwind CSS) --}}{{ $users->links() }}
Il metodo links() genera automaticamente l’HTML dei link. Vengono mostrati i link alle 3 pagine prima e dopo la pagina corrente.
Se hai due paginator sulla stessa schermata, entrambi usano il parametro page andando in conflitto. Cambia il nome del parametro con il terzo argomento.
// Aggiunge sort=votes a ogni link di pagina$users->appends(['sort' => 'votes']);// Eredita tutti i parametri di query della richiesta corrente$users->withQueryString();
Per incapsulare il risultato di paginate() in una API resource collection, passalo a UserResource::collection().
use App\Http\Resources\UserResource;use App\Models\User;Route::get('/api/users', function () { $users = User::paginate(15); return UserResource::collection($users);});
Passando il paginator a UserResource::collection(), le informazioni di paginazione vengono aggiunte automaticamente come metadati.
Nel JSON di cursorPaginate() non ci sono numeri di pagina ma next_cursor e prev_cursor. Il client API usa questi valori come parametro cursor della richiesta successiva.
{{-- Emette i link usando una vista personalizzata --}}{{ $paginator->links('vendor.pagination.custom') }}{{-- Passa dati aggiuntivi --}}{{ $paginator->links('vendor.pagination.custom', ['theme' => 'dark']) }}
Modifica direttamente tailwind.blade.php oppure crea una nuova vista e indicala in AppServiceProvider.
use Illuminate\Pagination\Paginator;public function boot(): void{ Paginator::defaultView('vendor.pagination.custom'); Paginator::defaultSimpleView('vendor.pagination.simple-custom');}
$paginator = User::paginate(15);$paginator->currentPage(); // Numero di pagina corrente$paginator->lastPage(); // Numero dell'ultima pagina (non disponibile con simplePaginate)$paginator->total(); // Totale (non disponibile con simplePaginate)$paginator->perPage(); // Elementi per pagina$paginator->count(); // Elementi nella pagina corrente$paginator->firstItem(); // Indice del primo elemento della pagina corrente$paginator->lastItem(); // Indice dell'ultimo elemento della pagina corrente$paginator->hasPages(); // Se esistono più pagine$paginator->hasMorePages(); // Se esiste una pagina successiva$paginator->onFirstPage(); // Se è la prima pagina$paginator->onLastPage(); // Se è l'ultima pagina$paginator->nextPageUrl(); // URL della pagina successiva$paginator->previousPageUrl(); // URL della pagina precedente$paginator->url(3); // URL della pagina 3$paginator->items(); // Array degli elementi della pagina corrente
paginate() — Quando servono totale e link ai numeri di pagina (schermate a lista comuni)
simplePaginate() — Quando bastano i soli link “precedente” e “successivo” (più veloce)
cursorPaginate() — Con grandi volumi di dati, scroll infinito o scritture frequenti (massime prestazioni)
Pattern base di visualizzazione Blade
@foreach ($users as $user) <p>{{ $user->name }}</p>@endforeach{{ $users->links() }}
Passa il risultato di paginate() alla vista e usa links() per emettere i link alle pagine.
La pagina corrente viene rilevata automaticamente dal parametro di query page.
Paginazione nelle API
Restituendo direttamente il paginator dalla route, viene convertito automaticamente in JSON.
Per combinarlo con le API resource restituisci UserResource::collection($paginator).
La risposta contiene data (array di record) e vari metadati.