Solución:
Puede hacer esto usando una combinación de Collection
métodos. Puede ser un poco difícil de seguir al principio, pero debería ser bastante fácil de romper.
// get your main collection with all the attributes...
$users = Users::get();
// build your second collection with a subset of attributes. this new
// collection will be a collection of plain arrays, not Users models.
$subset = $users->map(function ($user) {
return collect($user->toArray())
->only(['id', 'name', 'email'])
->all();
});
Explicación
Primero el map()
El método básicamente solo itera a través del Collection
y pasa cada elemento del Collection
a la devolución de llamada pasada. El valor devuelto de cada llamada de la devolución de llamada crea el nuevo Collection
generado por el map()
método.
collect($user->toArray())
está construyendo un nuevo y temporal Collection
fuera de Users
atributos.
->only(['id', 'name', 'email'])
reduce el temporal Collection
hasta solo los atributos especificados.
->all()
convierte lo temporal Collection
de nuevo en una matriz simple.
Póngalo todo junto y obtendrá “Para cada usuario de la colección de usuarios, devuelva una matriz de solo los atributos de identificación, nombre y correo electrónico”.
Actualización de Laravel 5.5
Laravel 5.5 agregó un only
método en el modelo, que básicamente hace lo mismo que el collect($user->toArray())->only([...])->all()
, por lo que esto se puede simplificar ligeramente en 5.5+ para:
// get your main collection with all the attributes...
$users = Users::get();
// build your second collection with a subset of attributes. this new
// collection will be a collection of plain arrays, not Users models.
$subset = $users->map(function ($user) {
return $user->only(['id', 'name', 'email']);
});
Si combina esto con la “mensajería de orden superior” para las colecciones introducidas en Laravel 5.4, se puede simplificar aún más:
// get your main collection with all the attributes...
$users = Users::get();
// build your second collection with a subset of attributes. this new
// collection will be a collection of plain arrays, not Users models.
$subset = $users->map->only(['id', 'name', 'email']);
usar User::get(['id', 'name', 'email'])
, le devolverá una colección con las columnas especificadas y si desea convertirlo en una matriz, solo use toArray()
después de la get()
método así:
User::get(['id', 'name', 'email'])->toArray()
La mayoría de las veces, no necesitará convertir la colección en una matriz porque las colecciones son en realidad matrices con esteroides y tiene métodos fáciles de usar para manipular la colección.
El método siguiente también funciona.
$users = User::all()->map(function ($user) {
return collect($user)->only(['id', 'name', 'email']);
});