¿QUÉ HACE PLUCK EN LARAVEL?

pluck en Laravel es uno de los métodos más útiles tanto del Query Builder como de las Collections. Básicamente sirve para extraer (o "arrancar", como su nombre en inglés) los valores de una sola columna (o atributo) de forma rápida y eficiente, devolviéndolos en un array o colección simple. Es perfecto cuando no se necesitan objetos completos de modelos Eloquent, solo una lista plana de valores (por ejemplo, para llenar un select de html, validar IDs existentes, etc.). Ejemplos:
  • Llenar un select
    // En un controlador o Form Request
    $categories = Category::pluck('name', 'id'); // [1 => 'Noticias', 2 => 'Tutoriales', ...]
    
    // En la vista (Blade)
     <select name="category_id" >
        @foreach($categories as $id => $name)
             <option value="{{ $id }}">{{ $name }}</option>
        @endforeach
     </select>
    
  • Obtener solo IDs o emails para validación
    $existingEmails = User::where('status', 'active')->pluck('email')->toArray();
    
    if (in_array($request->email, $existingEmails)) {
        // ya existe...
    }
    
  • Con clave personalizada (el segundo argumento es la clave)
    $locations = City::get()->pluck('country.name'); // ['España', 'México', 'Argentina', ...]
    
  • Closures para transformar al vuelo
    // Ejemplo nuevo y elegante
    $cities = City::pluck(fn ($city) => "{$city->country_code} - {$city->name}", 'id');
    // Resultado: [1 => 'ES - Madrid', 2 => 'MX - CDMX', ...]
    

pluck vs select vs get

Método Devuelve Hidratación de modelos Rendimiento Uso típico
pluck() Colección/array simple (1 o 2 cols) No ★★★★★ Listas planas, selects, IDs, validaciones
select() Colección de modelos/arrays con cols específicas Sí (si Eloquent) ★★★★ Necesitas varios campos pero no todos
get() Colección completa de modelos ★★ Necesitas todo el modelo y sus métodos

Diferencias clave según dónde se use pluck

Lugar donde lo usas Qué devuelve Ejemplo real SQL generado (aprox.) Cuándo usarlo
Query Builder / Eloquent Illuminate\Support\Collection Role::pluck('name', 'id') → [1 => 'Admin', 2 => 'User'] SELECT name, id FROM roles Siempre que puedas (más eficiente: no hidrata modelos completos)
Después de get() Illuminate\Support\Collection $users->pluck('email') → ['user1@example.com', 'user2@example.com'] (ya se hizo el SELECT antes) Cuando ya tienes la colección y quieres extraer algo rápido
En relaciones Colección con solo el atributo $post->comments()->pluck('id') → [5, 7, 12] SELECT id FROM comments WHERE post_id = ? Evitar N+1 en listas de IDs o nombres relacionados