Laravel provee de colecciones, que no son más que objetos que nos permiten hacer operaciones sobre arreglos de datos. Al ser objetos, las colecciones proveen de una interfaz fluida y de muchas más funciones que los arrays nativos de PHP. Es por ello que las consultas de Eloquent y Fluent retornan objetos de tipo «Collection» en vez de arrays.
A partir de Laravel 5.4, podemos utilizar una técnica llamada mensajes o funciones de «orden superior» en las colecciones y de esto te hablaré a detalle en la siguiente lección.
Notas
Vamos a definir una clase para los cursos con un título y con la opción de que sea premium
o no:
<?php class Course { public $title; public $premium; public function __construct($title, $premium = false) { $this->title = $title; $this->premium = $premium; } public function premium() { return $this->premium; } }
Ahora creamos una colección de cursos con el método collect
:
$courses = collect([ new Course('OOP', true), new Course('Primeros pasos', false), new Course('Git', true), new Course('Laravel 5.4', false) ]);
Usando métodos del objeto Collection podemos obtener los cursos premium, para este caso usaremos el método filter
:
$premiumCourses = $courses->filter(function ($course) { return $course->premium; });
O los gratuitos usando el método reject
:
<?php $freeCourses = $courses->reject(function ($course) { return $course->premium; });
Ahora a partir de Laravel 5.4 puedes hacerlo de esta nueva forma más rápida (usando una propiedad):
<?php $premiumCourses = $courses->filter->premium; $freeCourses = $courses->reject->premium;
O usando métodos:
<?php $premiumCourses = $courses->filter->premium(); $freeCourses = $courses->reject->premium();
Nota que la propiedad y el método premium
no están en el objeto Collection sino en los objetos que son parte de la colección.
Vale la pena mencionar que a partir de Laravel 5.3 también está disponible un método llamado partition
en la clase Collection que permite dividir una colección en 2:
<?php list($premiumCourses, $freeCourses) = $courses->partition('premium');
Así que si luego de obtener todos los cursos quisiera dividirlos en 2 listas (premium y gratuitos) entonces usaría partition
, en vez de otro método.
Pero esta nueva técnica es muy útil, por ejemplo si tienes una colección de facturas y quieres pagarlas todas llamando al método pay
en cada una:
<?php $invoices->each->pay();
El código es muy fácil de escribir y de leer.
Material relacionado
- Uso de colecciones en Fluent (constructor de consultas SQL)
- Uso avanzado del método where en Laravel 5.3
- Objetos inmutables en nuestro Curso de programación orientada a objetos en PHP
Si quedaste con dudas en esta lección por favor hazlas en nuestro Slack y te estaré contestando personalmente:
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección siguiente Componentes y slots en Laravel 5.4