Simplificando la manipulación de datos con las High Order Collections de Laravel
- Publicado el 10 septiembre, 2024
- Palabras: 464
Las colecciones de Laravel ya son una herramienta poderosa para trabajar con conjuntos de datos, pero las colecciones "High Order" (orden mayor) llevan esto al siguiente nivel. Estos métodos te permiten realizar operaciones comunes en colecciones de una manera más concisa y expresiva, lo que genera un código más limpio y legible. Veamos cómo puedes aprovechar las colecciones de orden mayor en tus proyectos de Laravel.
#Entendiento las colecciones High Order
Los métodos de las high order collections de Laravel te permiten llamar a métodos directamente en los elementos de la colección, sin necesidad de clousures anidados. Esto da como resultado un código más compacto y, a menudo, más legible.
Uso básico
A continuación se muestra un ejemplo sencillo que compara los métodos de colección tradicionales con los métodos de high order:
// Enfoque tradiconal
$activeUserNames = $users->filter(function ($user) {
return $user->isActive();
})->map(function ($user) {
return $user->name;
});
// Usando colecciones high order
$activeUserNames = $users->filter->isActive()->map->name;
Como puede ver, con el enfoque de orden mayor es mucho más conciso.
#Métodos comunes High Order
filter()
El método filter() se vuelve particularmente elegante con colecciones de orden mayor:
$adults = $users->filter->isAdult();
Esto supone que su modelo de User tiene un método isAdult().
map()
map() es otro método que se beneficia enormemente del enfoque de orden mayor:
$userEmails = $users->map->email;
Esto es equivalante a $users->map(function ($user) { return $user->email; }).
sort()
La ordenación también se puede simplificar:
$sortedUsers = $users->sortBy->lastLoginAt;
Encadenamiento de múltiples métodos de orden mayor
Una de los puntos fuertes de las colecciones de orden mayor es la capacidad de encadenar múltiples operaciones:
$result = $users
->filter->isActive()
->map->name
->sort()
->take(5);
Este código filtra los usuarios activos, asigna sus nombres, ordena los nombres y toma los primeros cinco.
#Ejemplo práctico: procesando pedidos
Veamos un ejemplo más complejo que implica el procesamiento de pedidos:
$highValueOrders = $orders
->filter->isPaid()
->filter->shipped()
->map->items
->collapse()
->groupBy->product_id
->map->sum('price')
->filter(function ($total) {
return $total > 1000;
})
->sortDesc()
->take(10);
Este código hace lo siguiente:
- Filtra los pedidos pagados y enviados
- Asigna los artículos en cada pedido
- Contrae los artículos en una sola colección
- Agrupa los artículos por ID de producto
- Suma el precio de cada producto
- Filtra los productos con ventas totales superiores a 1000
- Ordena en orden descendente
- Toma los diez primeros
#Combinación con métodos de colecciones habituales
Los métodos de orden mayor se pueden combinar sin problemas con los métodos de recolección regulares:
$result = $users
->filter->isActive()
->mapToGroups(function ($user) {
return [$user->role => $user->name];
})
->map->sort()
->map->take(3);
Esto agrupa a los usuarios activos por rol, ordena los nombres dentro de cada rol y toma los tres primeros de cada grupo.
#Consideraciones de rendimiento
Si bien las colecciones de orden mayor pueden hacer que su código sea más legible, tenga en cuenta que pueden tener una ligera sobrecarga de rendimiento en comparación con el uso directo de clousures. Para la mayoría de las aplicaciones, esta diferencia es insignificante, pero vale la pena considerarla para las secciones de su código que son críticas para el rendimiento.
Antonio Jenaro
Web Developer
Fuente: Harris Raftopoulos
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión