Saltar al contenido

Obtenga solo atributos específicos con de Laravel Collection

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 Collectiony 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']);
});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *