Laravel además de utilizar múltiples paquetes de terceros tambien es posible utilizar partes como componentes. Todos los componentes están bajo el namespace “Illuminate”.
Si hay una clase realmente interesante y útil es Collection, que nos permite trabajar con arrays de datos de una forma sencilla y “programática”.
Para tener esta clase en nuestro proyecto solo necesitaremos el paquete illuminate/support que podremos instalar con:
composer require illuminate/support:5.2.x-dev
Para mostrar algunos ejemplos utilizaremos un pequeño array con estos datos:
$array = [
[
'id' => 12,
'name' => 'El rinconcillo',
'category' => 'Bar',
'visits' => 102,
'stars' => 4.2,
'average_price' => 20,
'city' => 'Sevilla',
'region' => 'Andalucía',
],
[
'id' => 30,
'name' => 'El Choco',
'category' => 'Bar',
'visits' => 65,
'stars' => 4.9,
'average_price' => 12,
'city' => 'Pontecesures',
'region' => 'Galicia',
],
[
'id' => 89,
'name' => 'La Azotea',
'category' => 'Restaurant',
'visits' => 165,
'stars' => 4.7,
'average_price' => 30,
'city' => 'Sevilla',
'region' => 'Andalucía',
],
[
'id' => 22,
'name' => 'Casa Paco',
'category' => 'Restaurant',
'visits' => 15,
'stars' => 3.7,
'average_price' => null,
'city' => 'Sevilla',
'region' => 'Andalucía',
]
];
Con esto crearemos nuestro objeto collection así:
$places = new Illuminate\Support\Collection( $array ) ;
Ahora veremos unos ejemplos de que se puede hacer
Obtener una array (key => value ) con los elementos:
$list = $places->pluck( 'name', 'id')->all() ;
Resultado:
Array
(
[12] => El rinconcillo
[30] => El Choco
[89] => La Azotea
[22] => Casa Paco
)
Obtener el restaurante con la mayor puntuacion
$best_restaurant = $places
->where('category', 'Restaurant')
->sortByDesc( 'stars')
->take( 1 )
->toArray( );
;
Obtener la suma de visitas por tipo de negocio
$visits_by_category = $places
->groupBy( 'category')
->map( function( $value, $key ) {
return $value->reduce( function( $prev, $next){
return $prev + $next['visits'];
}, 0 );
})
->toArray();
La media de precios, por region, si el precio es nulo no lo tomaremos en consideración:
$average_prices_by_region = $places->groupBy('region')
->map(function ($value, $key) {
return $value->reject(function ($value, $key) {
return is_null($value['average_price']);
})
->reduce(function ($prev, $next) {
if ( empty( $prev)) {
$prev = $next['average_price'];
}
return ( $prev + $next['average_price'] ) / 2 ;
} );
})->toArray();
Estos son sólo unos pocos ejemplos que muestran una pequeña parte de las posibilidades de este poderosa clase, y como todo lo de Laravel, dispone de una completa documentación en: https://laravel.com/docs/5.2/collections