Skip to main content

¿Qué es la paginación?

La paginación de Laravel se integra con el query builder y Eloquent ORM, y se puede usar sin configuración. La página actual se obtiene automáticamente del parámetro page de la solicitud HTTP y se añade también a los enlaces generados. El HTML por defecto es compatible con Tailwind CSS, y también hay opción para Bootstrap CSS.

Tres tipos de paginación

Uso básico

Paginación con query builder

Paginación con Eloquent

simplePaginate

Cuando no necesitas la consulta de conteo total (solo “anterior/siguiente”), simplePaginate() es más eficiente.
Si no necesitas mostrar “X de N en total”, elige simplePaginate(). paginate() ejecuta un COUNT(*) adicional, por lo que simplePaginate() es más rápido.

cursorPaginate (paginación por cursor)

En lugar de OFFSET usa WHERE, por lo que ofrece un gran rendimiento con muchos datos. Es especialmente adecuado para interfaces de scroll infinito.
Las URLs contienen un cursor en lugar de un número de página.
Para usar cursorPaginate se necesita orderBy. Además, la columna de ordenación debe pertenecer a la tabla paginada.

OFFSET vs. cursor

La paginación por cursor aprovecha los índices y evita mejor la duplicación/omisión de registros cuando hay muchas inserciones/eliminaciones. Sin embargo, no genera enlaces por número de página, solo “anterior/siguiente”.

Implementación en el controlador

Mostrar enlaces de paginación en Blade

links() genera automáticamente el HTML de los enlaces. Muestra tres páginas a cada lado de la actual.

Ajustar el número de enlaces

Con onEachSide() cambias cuántas páginas se muestran a cada lado.

Recibir el tamaño de página desde la solicitud

Múltiples paginadores en una misma página

Si hay dos paginadores en una misma pantalla, ambos usan page y entran en conflicto. Cambia el nombre del parámetro con el tercer argumento.

Personalización de la URL

Cambiar la base de la URL

Añadir parámetros de query

Añadir fragmento hash

Respuesta API (JSON)

Al devolver un paginador directamente desde una ruta o controlador, se convierte automáticamente a JSON.
Formato de la respuesta JSON:

Combinación con API Resources

Para envolver el resultado de paginate() en una colección de recurso, pásaselo a UserResource::collection().
Al pasar el paginador a UserResource::collection(), la información de paginación se añade automáticamente como metadatos.
El JSON de cursorPaginate() incluye next_cursor y prev_cursor en lugar de números de página. El cliente API usa esos valores como parámetro cursor en la siguiente solicitud.

Vistas de paginación personalizadas

Indicar la vista directamente

Cambiar la vista por defecto

Primero publica las vistas oficiales para personalizarlas.
Se crean en resources/views/vendor/pagination/:
  • tailwind.blade.php — Por defecto (Tailwind CSS)
  • bootstrap-5.blade.php — Bootstrap 5
  • simple-tailwind.blade.php — Para simplePaginate
Puedes editar tailwind.blade.php directamente o crear una nueva vista e indicarla en AppServiceProvider.

Usar Bootstrap CSS

Para usar Bootstrap en lugar de Tailwind, indícalo en el boot() de AppServiceProvider.

Crear un paginador manualmente

Para paginar datos existentes (por ejemplo, un array), instancia directamente la clase.

Métodos de instancia habituales

Resumen

  • paginate() — cuando necesitas total y enlaces numerados (pantallas de listado habituales)
  • simplePaginate() — cuando basta con “anterior/siguiente” (más rápido)
  • cursorPaginate() — para grandes volúmenes, scroll infinito o mucha escritura (máximo rendimiento)
Pasa el resultado de paginate() a la vista y muestra los enlaces con links(). La página actual se detecta automáticamente desde el parámetro page.
Devolver el paginador desde la ruta lo convierte automáticamente a JSON. Para combinarlo con API Resources, devuelve UserResource::collection($paginator). La respuesta contiene data (registros) y varios campos de metadatos.
Última modificación el 13 de julio de 2026