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.

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

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

Si quedaste con dudas en esta lección por favor hazlas en nuestro Slack y te estaré contestando personalmente:

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección siguiente Componentes y slots en Laravel 5.4