Novedad Laravel 6: Lazy Collections

Spread the love

La clase LazyCollection en Laravel 6 es una mejora a las colecciones actuales.

Aprovecha el uso de los generadores de php para poder recorrer conjuntos de datos muy grandes sin hacer un uso excesivo de la memoria.

Si esto no te dice nada, no te preocupes vamos a ver un ejemplo para que sea mas claro.

Clase Lazy Collection

Vamos a suponer que tienes el siguiente ejemplo.

$numbers = Collection::make(range(1, 10000000))
            ->map(function ($number) {
                return $number ** 3;
            })
            ->filter(function ($number) {
                return $number % 2;
            })
            ->take(100)
            ->all();

 dump($numbers);

Si ejecutas esto en una instalación estándar de php, vas a notar que el código termina con el siguiente mensaje de error.

Allowed memory size of 536870912 bytes exhausted (tried to allocate 536870920 bytes)

Y esto se debe a que la colección intenta crear un arreglo tan grande que termina acabado con la memoria disponible.

Ahora veamos el mismo ejemplo, usando la clase LazyCollection.

$numbers = LazyCollection::times(10000000)
            ->map(function ($number) {
                return $number ** 3;
            })
            ->filter(function ($number) {
                return $number % 2;
            })
            ->take(100)
            ->all();

 dump($numbers);

Si ejecutas este código vas a ver que el ejemplo corre sin problema, gracias al uso de los generadores de PHP. Que permiten recorrer los elementos de la colección sin tener que usar un arreglo en memoria!.

Esto te da una increíble ventaja a la hora de procesar grandes cantidades de datos: como por ejemplo cuando requieres importar o exportar datos o Hacer cálculos en el resultado de una consulta a un API externa.

Además, Eloquent también usa de forma nativa esta clase.

Lazy Collection y Eloquent

Para hacer uso de la clase Lazy Collection con Eloquent, solo requieres invocar el método cursor() en lugar de get().

y de esta forma puedes procesar los resultados de la forma que lo requieras.

Poro ejemplo puedes hacer algo tan simple como:

$users = App\User::cursor()->filter(function ($user) {
    return $user->id > 500;
});

Y funcionara sin problema y sin que el proceso termine con una excepción!

Resumen

La clase LazyCollection te permite iterar conjuntos grandes de datos intentando usar la menor cantidad de memoria posible.

Es posible usar esta clase junto con Eloquent invocando el método cursor().

Se pueden utilizar en cualquier problema que requiera iterar o procesar grandes cantidades de datos.

En otro articulo platicare con mas detalle esta funcionalidad. Pero de momento si te gusto el articulo compártelo y si tienes alguna duda deja tu comentario.