Modificar resultados de paginación en Laravel

Actualizado el 11 de febrero de 2024

Imagina que estas desarrollando un API REST para una aplicación que permite a los usuarios publicar anuncios de venta de productos y servicios. Una de las políticas de la aplicación es que los usuarios no deben publicar números de contacto en el contenido de los anuncios.

Entonces usando un modelo Advert recuperas los anuncios de los usuarios. Por su puesto, paginamos los resultados para evitar retornar cientos o miles de resultados al cliente.

App\Models\Advert;

$advert = Advert::paginate(50);

return $advert;

Pero recuerda que no puedes simplemente confiar en que los usuarios han leído los términos y condiciones de uso de la aplicación y van a respetarlos. Por otro lado, podríamos controlar el ingreso de números de teléfono al momento de en que los usuarios crean los anuncios. Sin embargo, vamos a ponernos en el escenario en el que queremos guardar la información tal como el usuario la ingresó.

Así que necesitamos una forma de obtener los resultados paginados y modificarlos antes de enviarlos de vuelta al cliente. Para ello usamos el método through después de paginar los resultados. Este método recibe un closure como parámetro y lo aplica a cada uno de los resultados de la paginación.

App\Models\Advert;

$advert = Advert::paginate(50)
    ->through(function ($advert) {
        $advert->content = preg_replace('/(\d\s?){9,10}/', '[Número de teléfono oculto]', $advert->content);
    });

return $advert;

En el ejemplo utilizamos una expresión regular para modificar cualquier secuencia de números consecutivos de 9 o 10 dígitos que podrían ser un número de teléfono. Claro, es una expresión regular muy básica que probablemente no toma en cuenta todos los escenarios posibles, pero la idea está clara.

Al usar through logramos modificar los resultados, manteniendo $advert como objeto de paginación. Por supuesto este es un ejemplo muy simplificado y habrá muchos otros casos en los que este método pueda serte útil.

Jairo Ushiña

Jairo Ushiña

laravel paginacion
Backfron
Guayaquil, Ecuador
info@backfron.com