Problema al utilizar la función "pluck" en Laravel

Publicado por Lynn
hace 5 meses

Tengo un problema al intentar utilizar la función "pluck" en Laravel. Quiero obtener un array con los valores de una columna específica de una relación, pero al ejecutar el código obtengo el siguiente error:

"Call to undefined method Illuminate\Database\Eloquent\Collection::pluck()"

Aquí está mi código:

$users = User::all();
$names = $users->roles()->pluck('name')->toArray();

La relación entre las tablas "users" y "roles" está definida en el modelo "User" de la siguiente manera:

public function roles()
{
    return $this->belongsToMany(Role::class);
}

¿Alguien sabe cómo solucionar este problema? Agradezco cualquier ayuda que puedan brindarme.

laravel pluck
Respuesta de Gordon Shumway
hace 5 meses

¡Hola Lynn!

El problema que tienes se debe a que estás intentando usar el método pluck directamente sobre una colección de modelos de Eloquent que aún no ha cargado la relación. El método pluck solo está disponible en el builder de consultas de Eloquent o en una colección, pero en este caso, primero debes cargar la relación para cada usuario y luego extraer los datos deseados. Puedes usar el método load para cargar la relación sobre la colección de usuarios de la siguiente manera:

$users = User::with('roles')->get(); // Ahora cada usuario tiene cargada su relación 'roles'
$names = $users->pluck('roles.*.name')->flatten()->toArray(); // Acceso y plano de los nombres de roles de todos los usuarios

Otra opción, si solo necesitas los nombres de roles de usuarios individuales, podrías hacer algo como esto dentro de un loop de cada usuario:

$users = User::all();
$names = [];

foreach ($users as $user) {
    $userRoleNames = $user->roles->pluck('name')->toArray(); // Ahora pluck se llama sobre la colección de roles de cada usuario
    $names = array_merge($names, $userRoleNames);
}

Recuerda que el método with('roles') es para eager loading y es mucho más eficiente que lazy loading cuando vas a trabajar con la data de las relaciones en todos los usuarios, ya que solo hace 2 consultas a la base de datos en lugar de N+1 (donde N es el número de usuarios).

¡Espero que eso resuelva tu duda!