⚡️Colecciones Eloquent y métodos avanzados (Map, Filter)

 

⚡️ Colecciones Eloquent y métodos avanzados (Map, Filter)

 
   

Manipulando datos con elegancia y eficiencia

   

      Cuando Eloquent recupera resultados de la base de datos, no devuelve un simple array, sino un objeto de tipo **Collection**. Esta clase especial de Laravel es extremadamente poderosa, ya que hereda una gran cantidad de métodos que permiten manipular conjuntos de datos de forma limpia, encadenada y expresiva. Dominar estos métodos (como **map** y **filter**) es clave para escribir código más funcional y legible.    

 
    
   

📦 ¿Qué es una Colección en Laravel?

   

      Una Colección es un **iterable** que envuelve un array de datos (ya sean modelos Eloquent, arrays o datos planos). La principal ventaja es que te proporciona una API rica en métodos que puedes encadenar para realizar transformaciones de datos sin la necesidad de bucles foreach complejos.    

   
     

"Las Colecciones permiten tratar los conjuntos de modelos como si fueran un objeto manipulable con una sintaxis concisa."

   
 
 
   

🔄 Método map: Transformar cada elemento

   

      El método map() es ideal cuando quieres aplicar una función de *callback* a **cada elemento** de la colección y obtener una **nueva colección** con los resultados transformados. No modifica la colección original.    

   

Ejemplo Visual: Añadir un campo calculado

Imagina que tienes una colección de productos y quieres añadir un campo precio_con_iva a cada uno.

   
     
        Ejemplo con map()              
     
// Supongamos que $productos es una Colección de modelos Producto
$productos = App\Models\Producto::all();

$productosConIVA = $productos->map(function ($producto) {
    // Añadimos el nuevo atributo al objeto
    $producto->precio_con_iva = $producto->precio * 1.21;
    // Devolvemos el objeto transformado
    return $producto;
});

// $productosConIVA ahora contiene todos los productos con el nuevo campo.
   
 
 
   

🔎 Método filter: Filtrar por una condición

   

      El método filter() se utiliza para **reducir** la colección, manteniendo solo aquellos elementos que cumplen una determinada condición. La función de *callback* que le pases debe devolver true para mantener el elemento o false para eliminarlo.    

   

Ejemplo Visual: Seleccionar usuarios activos

Queremos obtener solo los usuarios cuya cuenta esté marcada como activa.

   
     
        Ejemplo con filter()              
     
// Supongamos que $usuarios es una Colección de modelos User
$usuarios = App\Models\User::all();

$usuariosActivos = $usuarios->filter(function ($user) {
    // Solo se mantienen los usuarios donde el campo 'activo' sea true
    return $user->activo === true;
});

// $usuariosActivos es una nueva colección solo con los usuarios activos.
   
 
    
   

⛓️ Encadenamiento (Chaining) de Métodos

   

      La verdadera potencia de las colecciones reside en que la mayoría de los métodos (como map y filter) devuelven una **nueva Colección**, permitiendo encadenar operaciones en una sola línea.    

   

Ejemplo Encadenado:

   
     
        map y filter juntos              
     
$informes = App\Models\Venta::all()
    // 1. Filtramos solo las ventas realizadas en el año actual
    ->filter(fn ($venta) => $venta->created_at->year === date('Y'))
    // 2. Transformamos cada venta al formato deseado para el informe
    ->map(function ($venta) {
        return [
            'total' => $venta->monto_total,
            'vendedor' => $venta->user->nombre,
            'fecha' => $venta->created_at->format('d/m/Y'),
        ];
    });

// $informes ahora es un array de objetos simples, limpio y filtrado.
   
 
    

Publicar un comentario

0 Comentarios