Colecciones en Laravel

- Andrés Cruz

In english

Este material forma parte de mi curso y libro completo; puedes adquirirlos desde el apartado de libros y/o cursos Curso y libro Laravel 11 con Tailwind Vue 3, introducción a Jetstream Livewire e Inerta desde cero - 2024.

Las colecciones no son nada nuevo, hasta este momento hemos empleado las colecciones en los desarrollos anteriores, cada vez que teníamos una lista como respuesta de la base de datos para crear una tabla en una vista, se emplean colecciones:

Category::all();

Y esto es algo muy fácil de ver si imprimir el resultado anterior en modo debug o tinker:

dd(Category::all());

Illuminate\Database\Eloquent\Collection 
  #items: array:N
}

Las colecciones en Laravel son una herramienta esencial en Laravel para manejar listados, pero, también podemos crear nuestras propias colecciones como veremos en este apartado.

Las colecciones no son más que los arrays de PHP pero con vitaminas, esto quiere decir a que son los mismos arrays pero con un conjunto de funcionalidades adicionales para que sean más fáciles y amigables su uso bajo la clase:

Illuminate\Support\Collection 

Aunque, esta clase no solamente es empleada de manera interna, también podemos emplearlo de manera manual, es decir, podemos crear una colección de un array en PHP:

$personas = [
        ["nombre" => "usuario 1", "edad" => 50],
        ["nombre" => "usuario 2", "edad" => 70],
        ["nombre" => "usuario 3", "edad" => 10],
];

Para ello, tenemos varias formas:

use Illuminate\Support\Facades\Collection;
***
$collection1 = collect($personas);
//dd($collection1);
$collection2 = new Collection($personas);
//dd($collection2);
$collection3 = Collection::make($personas);
//dd($collection3);

Con la colección, ahora es posible emplear métodos propios de la colección de todo tipo como el de filtro:

$collection2->filter(function($value,$key){
    return $value['edad'] > 17;
})

El cual, devuelve una colección de aquellos elementos que cumplan la condición, en este ejemplo en donde la edad sea mayor a 17:

Illuminate\Support\Collection {#5178
    all: [
      [
        "nombre" => "usuario 1",
        "edad" => 50,
      ],
      [
        "nombre" => "usuario 2",
        "edad" => 70,
      ],
    ],
  }

Al devolver el método de filter() una colección, podemos encolar otras operaciones sobre colecciones como la de sumar:

$collection2->filter(function($value,$key){
    return $value['edad'] > 17;
})->sum('edad'));

Que en este caso, no devuelve una colección, sino un entero:

120

Otro método interesante es el de intercepción que elimina cualquier valor de la colección original que no esté presente en el array suministrado:

$collection = collect(['Desk', 'Sofa', 'Chair']);
$intersect = $collection->intersect(['Desk']);

Y devuelve:

$collection->intersect(['Desk'])                                                                                               
= Illuminate\Support\Collection {#5118
    all: [
      "Desk",
    ],
  }

Estos métodos son propios de las colecciones, puedes revisar la documentación oficial para conocer la enorme cantidad de métodos que solamente tenemos disponibles al emplear las colecciones y que no existen con los arrays en:

https://laravel.com/docs/master/collections

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy