5.20 Paginación, Filtrado y Ordenación en Laravel
5.20.1 Introducción
En aplicaciones con grandes volúmenes de datos, mostrar toda la información en una sola página es poco práctico y perjudica el rendimiento y la experiencia del usuario. La paginación es una técnica para dividir los resultados en páginas, permitiendo mostrar un número limitado de elementos por página.
Además, la filtración y la ordenación son funcionalidades comunes que permiten al usuario buscar y organizar los datos según sus criterios.
En este tema construiremos una aplicación que permitirá paginar, filtrar y ordenar una lista de productos de manera sencilla y clara.
5.20.2 Preparación del entorno: Base de datos y datos de prueba
5.20.2.1 Creación de la tabla products
Vamos a crear la tabla products que tendrá los campos básicos: nombre y precio.
Ejecuta:
En la migración generada (database/migrations/YYYY_MM_DD_create_products_table.php):
migracion
Ejecuta la migración:
5.20.2.2 Crear Factory para Product
Crea el factory para generar datos de prueba:
Edita database/factories/ProductFactory.php:
ProductFactory
No olvidar indicar en el modelo Product que use el factory:
Product
5.20.2.3 Crear Seeder para products
Crea un seeder:
En database/seeders/ProductSeeder.php:
Registra el seeder en DatabaseSeeder.php:
Ejecuta:
Verifica que hay 100 productos en la tabla y que los datos son correctos.
5.20.3 Implementación básica de paginación
Ahora que tenemos los datos, vamos primero a implemnentar la ruta y el controlador para mostrar la lista de productos.
5.20.3.1 Ruta y controlador
En routes/web.php:
Crea el controlador:
En app/Http/Controllers/ProductController.php:
Creamos el método index para mostrar la lista de productos, en principio sin paginación para comprobar que todo funciona correctamente.
Controller
Ahora creamos la vista resources/views/products/index.blade.php:
Vista
Con esto podemos comprobar que la lista de productos se muestra correctamente y que son demasiados para mostrarlos todos a la vez. Vamos ahora a implementar la paginación para que se muestre un número limitado de productos por página.
Comenzamos por modificar el método index del controlador para que use la paginación de Laravel.
Controller
¿Qué hace paginate(10)? Carga 10 productos por página y genera la lógica necesaria para manejar la paginación. Esta lógica nos permitirá mostrar los enlaces de paginación en la vista.
5.20.3.2 Vista paginada
En resources/views/products/index.blade.php:
vista paginada
Podemos ver como en la url se añaden parámetros para la paginación, como page=2, y se generan enlaces para navegar entre las páginas.
Explicación
paginate(10): Carga 10 productos por página.links(): Genera la botonera de paginación.appends(): Mantiene los parámetros de la URL al cambiar de página.- Parámetros opcionales para
paginate()permiten personalizar la página actual y otros aspectos.
Diferencia con simplePaginate()
- No muestra número de páginas, solo enlaces para siguiente/anterior.
- Más eficiente para grandes conjuntos de datos.
Claro, aquí tienes una versión extendida y muy didáctica del apartado sobre personalización avanzada de paginación en Laravel, enfocada en que los alumnos entiendan todo el proceso para usar plantillas de paginación con Bootstrap o Tailwind y puedan personalizarlas fácilmente.
5.20.4 Personalización avanzada de paginación
Cuando utilizamos la paginación con Laravel, el método links() genera automáticamente los controles de paginación (botonera, enlaces, etc.) utilizando una vista por defecto. Esta vista puede ser personalizada para ajustarse a la estética y funcionalidades específicas de tu aplicación.
5.20.4.1 ¿Dónde están las vistas de paginación?
Laravel incluye varias vistas de paginación listas para usar, adaptadas a diferentes frameworks CSS:
- Tailwind CSS (usada por defecto en Laravel 8+).
- Bootstrap 4.
- Bootstrap 5.
- Simple pagination (versión simplificada sin botones numéricos).
Estas vistas se encuentran dentro del paquete de Laravel, normalmente en:
Si deseas modificarlas, no debes tocar esos archivos directamente, sino copiarlas a tu carpeta de vistas para sobreescribirlas.
5.20.4.2 Cómo copiar las vistas para personalizar la paginación
Ejecuta el siguiente comando para publicar las vistas de paginación en tu carpeta resources:
Esto copiará las vistas a:
Ahí encontrarás los archivos:
tailwind.blade.phpbootstrap-4.blade.phpbootstrap-5.blade.phpsimple-tailwind.blade.phpsimple-bootstrap-4.blade.php
Ahora, puedes editar cualquiera de estos archivos para personalizar el marcado HTML, clases CSS, o la estructura según tus necesidades.
5.20.4.3 Estructura típica de una vista de paginación
Vamos a analizar rápidamente el archivo bootstrap-4.blade.php como ejemplo.
- Está compuesto por una lista (
<ul>) con elementos (<li>) para cada página. - Cada enlace tiene clases de Bootstrap para que la botonera se vea acorde al framework.
- Hay controles para página anterior, siguiente, y botones numerados.
- Se usa la variable
$paginatorpara acceder a la información de paginación (como el número de página actual, URLs, etc.).
Por ejemplo, un fragmento típico para mostrar un botón activo se ve así:
El fragmento para botones con enlaces normales:
Puedes cambiar las clases, agregar iconos o modificar cualquier aspecto del HTML para que la paginación encaje con tu diseño.
5.20.4.4 Cómo usar la plantilla Bootstrap o Tailwind en la vista
Para usar explícitamente la paginación con una plantilla específica, por ejemplo, Bootstrap 5, debes pasar el nombre de la vista al método links().
En tu vista Blade:
Esto fuerza a Laravel a usar la plantilla bootstrap-5.blade.php para generar la paginación.
link a bootstrap 5
Si usas Bootstrap 5, asegúrate de tener la versión correcta instalada y configurada en tu proyecto. Puedes instalar Bootstrap 5 con npm o incluirlo directamente desde un CDN en tu layout principal.
Si quieres usar Tailwind (que es el valor por defecto en Laravel 8+):
O explícitamente:
link a tailwind
Si usas Tailwind CSS, asegúrate de tenerlo instalado y configurado en tu proyecto. Puedes instalar Tailwind CSS con npm o incluirlo directamente desde un CDN en tu layout principal.
5.20.4.5 Cambiar el número de elementos por página
Puedes cambiar el número de elementos que se muestran por página simplemente pasando un valor diferente a paginate(). Por ejemplo, para mostrar 25 productos por página:
Recuerda que si usas filtros o parámetros GET, deberás mantenerlos con appends() para que no se pierdan al cambiar de página.
5.20.5 Paginación con filtros
Crear formulario de filtrado
Lo primero será permitir al usuario qintroducir datos que se conviertan en filtros a la hora de mostrar los productos. Para ello, crearemos un formulario en la vista que permita al usuario introducir criterios de búsqueda.
Añade en la vista:
filtros
Modificar controlador
Controller
appends($request->all())mantiene los filtros al cambiar de página.
5.20.6 Ordenación de resultados
Modificar vista para ordenar
Añade enlaces para ordenar:
enlaces
Controlador para ordenar
mofificación del controlador
Mejora visual
Para finalizar podemos mejorar el aspecto visual de la página utilizando Bootstrap o Tailwind CSS. Simplemente añade el CDN correspondiente en tu layout principal. También vamos a poner los botones de editar, borrar y añadir en la parte superior de la tabla para que el usuario pueda interactuar con los productos de forma más sencilla. Aunque no están implemnentados, los enlaces estarán ahí para que el alumno pueda ver cómo se haría.
mejora visual

5.20.7 Conclusiones
- La paginación mejora rendimiento y UX.
- Se puede combinar con filtros y ordenación sin perder el estado.
- Laravel facilita la personalización de la vista de paginación.
- Buenas prácticas para consultas eficientes.
5.20.8 Paginación en APIs con Laravel
¿Por qué usar paginación en APIs?
Cuando una API devuelve grandes volúmenes de datos, paginar los resultados es fundamental para evitar enviar demasiada información de golpe, lo que puede afectar el rendimiento y el consumo de recursos tanto en servidor como en cliente.
Laravel facilita la paginación en APIs y ofrece una respuesta JSON que incluye información extra útil para manejar la paginación desde el cliente.
Implementación básica de paginación en un controlador API
Ejemplo de método index en un controlador API para productos:
modificación del controlador
Estructura de la respuesta JSON paginada
La respuesta JSON que devuelve Laravel contiene, además de los datos (por ejemplo, los productos), otros campos útiles para manejar la paginación en el cliente:
response JSON
Campos importantes en la respuesta paginada
| Campo | Descripción |
|---|---|
current_page |
Página actual que está viendo el cliente. |
data |
Array con los elementos de la página actual. |
first_page_url |
URL para la primera página. |
last_page |
Número total de páginas disponibles. |
last_page_url |
URL para la última página. |
links |
Array con enlaces de paginación para navegación. |
next_page_url |
URL para la siguiente página (null si es la última). |
prev_page_url |
URL para la página anterior (null si es la primera). |
per_page |
Número de elementos por página. |
total |
Total de elementos en la consulta. |
Personalización y filtros en API paginada
Al igual que en vistas, puedes combinar la paginación con filtros y ordenación, pasando los parámetros como query strings y aplicándolos en la consulta antes de llamar a paginate().
Ejemplo:
modificación del controlador
Resumen
- La paginación en APIs es esencial para controlar el volumen de datos enviados.
- Laravel ofrece un formato JSON con toda la información necesaria para que el cliente pueda navegar entre páginas.
- Puedes combinar paginación con filtros y ordenación para APIs más flexibles.