Cómo seleccionar columnas específicas en laravel elocuente


138

Digamos que tengo 7 columnas en la tabla, y quiero seleccionar solo dos de ellas, algo como esto

SELECT `name`,`surname` FROM `table` WHERE `id` = '1';

En el modelo elocuente laravel puede verse así

Table::where('id', 1)->get();

pero supongo que esta expresión seleccionará TODAS las columnas donde id es igual a 1, y solo quiero dos columnas (nombre, apellido). ¿Cómo seleccionar solo dos columnas?


Gracias por hacer la pregunta. Es una locura, ya que siempre he hecho esto correctamente en las consultas SQL 'clásicas', pero al tener que usar Eloquent, me pareció tan confuso que estaba feliz de que funcionara y no tenía en cuenta la cantidad de memoria que usaban mis consultas porque Estaba seleccionando todo.
Jonny Perl

Respuestas:


224

Puedes hacerlo así:

Table::select('name','surname')->where('id', 1)->get();

1
supongamos que quiero seleccionar cada campo, espere uno, ¿cómo puedo hacer eso?
Prince Arora

1
En primer lugar, cuando tenga alguna pregunta, haga una. Y para su caso, solo mencione todas las columnas en lugar de la que no desea incluir. Es fácil.
Marcin Nabiałek

2
¿No hay otro método para hacerlo sin mencionar todas las columnas?
Príncipe Arora

1
Esto funciona para un caso básico con una sola tabla. Sin embargo, si está utilizando una relación sobre una tabla dinámica, TAMBIÉN seleccionará las columnas dinámicas automáticamente.
Benubird

1
@OPV Simplemente ejecuta una SELECT name, surname FROM Table where id = 1consulta SQL
Marcin Nabiałek

67
Table::where('id', 1)->get(['name','surname']);

Quiero lo mismo pero usando un método diferente. Quiero seleccionar el método creando una instancia del modelo y luego seleccionar la columna. es decir, $ model = new MyModel (); $ modelo-> select (['' col1 ',' col2 ']); Pero esto no está funcionando
Dhirender

49

Al usar el método all () podemos seleccionar columnas particulares de la tabla como se muestra a continuación.

ModelName::all('column1', 'column2', 'column3');

Nota : Laravel 5.4


Quiero lo mismo pero usando un método diferente. Quiero seleccionar el método creando una instancia del modelo y luego seleccionar la columna. es decir, $ model = new MyModel (); $ modelo-> select (['' col1 ',' col2 ']); Pero esto no está funcionando.
Dhirender

37

También puedes usar find()así:

ModelName::find($id, ['name', 'surname']);

La $idvariable puede ser una matriz en caso de que necesite recuperar varias instancias del modelo.


24

Además Model::all(['id'])->toArray(), solo buscará la identificación como matriz.


17

Primero debe crear un Modelo, que represente esa Tabla y luego usar la siguiente forma Elocuente para obtener los datos de solo 2 campos.

Model::where('id', 1)
         ->pluck('name', 'surname')
         ->all();

Esta es la mejor respuesta, ya que funciona también con tablas dinámicas en muchas relaciones.
Luciano Fantuzzi

8

Puede usar get () y all ()

ModelName::where('a', 1)->get(['column1','column2']);

4

También puedes usar pluck.

Model::where('id',1)->pluck('column1', 'column2');

66
Tenga en cuenta que pluck()es menos eficiente que los otros métodos discutidos porque no modifica la SELECT ...consulta, sino que funciona en el conjunto de resultados ya devuelto.
Ben Johnson

4

Obtener el valor de una columna:

Table_Name::find($id)->column_name;

Incluso puedes usar este método con la cláusula where:

Table_Name::where('id',$id)->first()->column_name;

en el generador de consultas:

DB::table('table_names')->find($id)->column_name;

con donde cluase:

DB::table('table_names')->where('id',$id)->first()->column_name;

o

DB::table('table_names')->where('id',$id)->first('column_name');

resultado del último método es matriz


3

Puedes usar Table::select ('name', 'surname')->where ('id', 1)->get ().

Tenga en cuenta que al seleccionar solo ciertos campos, tendrá que hacer otra consulta si termina accediendo a esos otros campos más adelante en la solicitud (eso puede ser obvio, solo quería incluir esa advertencia). Incluir el campo id suele ser una buena idea para que laravel sepa cómo escribir las actualizaciones que realice en la instancia del modelo.


3

Desde laravel 5.3 solo usando el get()método puede obtener columnas específicas de su tabla:

YouModelName::get(['id', 'name']);

O desde laravel 5.4 también puede usar el all()método para obtener los campos de su elección:

YourModelName::all('id', 'name');

con los dos métodos anteriores get()o all()también puede usar, where()pero la sintaxis es diferente para ambos:

Modelo :: todos ()

YourModelName::all('id', 'name')->where('id',1);

Modelo :: get ()

YourModelName::where('id',1)->get(['id', 'name']);

3

Para obtener el resultado de una columna específica de la tabla, debemos especificar el nombre de la columna.

Use el siguiente código: -

   $result = DB::Table('table_name')->select('column1','column2')->where('id',1)->get();  

por ejemplo -

$result = DB::Table('Student')->select('subject','class')->where('id',1)->get();  

Agregue alguna explicación a su respuesta para que otros puedan aprender de ella
Nico Haase

2

Si bien el enfoque más común es el uso Model::select, puede causar la representación de todos los atributos definidos con métodos de acceso dentro de las clases de modelo. Entonces, si define un atributo en su modelo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

Y luego usa: TableName::select('username')->where('id', 1)->get();

Producirá la colección con ambos first_namey username, en lugar de solo el nombre de usuario.

Mejor uso pluck(), solo u opcionalmente en combinación con select, si desea columnas específicas.

TableName::select('username')->where('id', 1)->pluck('username');

o

TableName::where('id', 1)->pluck('username'); // eso devolvería la colección que consta solo de usernamevalores

Además, opcionalmente, use ->toArray()para convertir el objeto de colección en una matriz.


1

->get()al igual que ->all()(y ->first()etc.) puede tomar los campos que desea recuperar como parámetros;

->get/all(['column1','column2'])

Traería de vuelta la colección pero solo con column1ycolumn2


1

también puedes usar findOrFail() método aquí , es bueno usar

Si no se detecta la excepción, se envía automáticamente una respuesta HTTP 404 al usuario. No es necesario escribir comprobaciones explícitas para devolver respuestas 404 cuando el uso de este método no da un error 500.

ModelName::findOrFail($id, ['firstName', 'lastName']);

1

Si desea obtener una sola fila y de esa fila una sola columna, use un código de línea para obtener el valor de la columna específica find() método junto con la especificación de la columna que desea recuperar.

Aquí está el código de muestra:

ModelName::find($id_of_the_record, ['column_name'])->toArray()['column_name'];

0

Puede usar la siguiente consulta:

Table('table')->select('name','surname')->where('id',1)->get();

1
Agregue alguna explicación a su respuesta para que otros puedan aprender de ella
Nico Haase

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.