Como selecionar colunas específicas no laravel eloquent

137

digamos que tenho 7 colunas na tabela e quero selecionar apenas duas delas, algo como isto

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

No modelo laravel eloquente, pode parecer com isso

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

mas acho que essa expressão selecionará TODAS as colunas onde id é igual a 1 e quero apenas duas colunas (nome, sobrenome). como selecionar apenas duas colunas?

devnull Ψ
fonte
Obrigado por fazer a pergunta. É uma loucura, como sempre fiz isso corretamente em consultas SQL 'clássicas', mas, ao usar o Eloquent, achei tão confuso que fiquei feliz em fazê-lo funcionar e não percebi a quantidade de memória que minhas consultas estavam usando porque eu estava selecionando tudo.
Jonny Perl

Respostas:

223

Você pode fazer assim:

Table::select('name','surname')->where('id', 1)->get();
Marcin Nabiałek
fonte
1
Vamos supor que eu quero para selecionar todos os campos esperam um como eu posso fazer isso
Príncipe Arora
1
Primeiro de tudo, quando você tiver uma pergunta, faça uma. E para o seu caso - apenas mencione todas as colunas, em vez da coluna que não deseja incluir. É tão fácil.
Marcin Nabiałek 5/0318
2
Não há qualquer outro método para fazer isso sem mencionar todas as colunas
Príncipe Arora
1
Isso funciona para um caso básico com uma única tabela. No entanto, se você estiver usando uma relação sobre uma tabela dinâmica, isso TAMBÉM selecionará as colunas dinâmicas automaticamente.
Benubird
1
@OPV Ele apenas executa SELECT name, surname FROM Table where id = 1consulta SQL
Marcin Nabiałek
67
Table::where('id', 1)->get(['name','surname']);
Utkarsh Pandey
fonte
Eu quero a mesma coisa, mas usando um método diferente. Eu quero selecionar o método, criando a instância do modelo e, em seguida, selecione a coluna. ou seja, $ model = new MyModel (); $ model-> select (['col1', 'col2']); Mas essa coisa não está funcionando #
28418 Dhirender
49

Usando o método all (), podemos selecionar colunas específicas da tabela como mostrado abaixo.

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

Nota : Laravel 5.4

Sivakumar Tadisetti
fonte
Eu quero a mesma coisa, mas usando um método diferente. Eu quero selecionar o método, criando a instância do modelo e, em seguida, selecione a coluna. ou seja, $ model = new MyModel (); $ model-> select (['col1', 'col2']); Mas essa coisa não está funcionando.
Dhirender
37

Você também pode usar find()assim:

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

A $idvariável pode ser uma matriz, caso você precise recuperar várias instâncias do modelo.

Sammie
fonte
24

Além disso, Model::all(['id'])->toArray()ele apenas buscará o ID como array.

user3888958
fonte
17

Você primeiro precisa criar um Modelo, que represente essa Tabela e, em seguida, use a maneira Eloquent abaixo para buscar os dados de apenas 2 campos.

Model::where('id', 1)
         ->pluck('name', 'surname')
         ->all();
Mahesh Yadav
fonte
Essa é a melhor resposta, pois também funciona com tabelas dinâmicas em muitos ou muitos relacionamentos.
Luciano Fantuzzi
8

Você pode usar get () e all ()

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

Também você pode usar arrancar.

Model::where('id',1)->pluck('column1', 'column2');
bereket gebredingle
fonte
6
Observe que pluck()é menos eficiente do que os outros métodos discutidos porque não modifica a SELECT ...consulta, mas opera no conjunto de resultados já retornado.
217 Ben Ben Johnson
4

Obtenha o valor de uma coluna:

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

Mesmo você pode usar este método com a cláusula where:

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

no construtor de consultas:

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

com where cluase:

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

ou

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

último resultado do método é array

Mostafa Asadi
fonte
3

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

Lembre-se de que, ao selecionar apenas determinados campos, você precisará fazer outra consulta se acabar acessando esses outros campos posteriormente na solicitação (isso pode ser óbvio, só queria incluir essa ressalva). Incluir o campo id geralmente é uma boa idéia, para que o laravel saiba como escrever de volta as atualizações que você fizer na instância do modelo.

Josh Rumbut
fonte
3

No laravel 5.3, apenas usando o get()método, você pode obter colunas específicas da sua tabela:

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

Ou no laravel 5.4, você também pode usar o all()método para obter os campos de sua escolha:

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

com o método acima get()ou all()você também pode usar, where()mas a sintaxe é diferente para ambos:

Model :: all ()

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

Model :: get ()

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

Para obter o resultado de uma coluna específica da tabela, precisamos especificar o nome da coluna.

Use o seguinte código: -

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

por exemplo -

$result = DB::Table('Student')->select('subject','class')->where('id',1)->get();  
Jitender Sharma
fonte
Por favor, adicione um pouco de explicação para a sua resposta de forma que outros possam aprender com ele
Nico Haase
2

Embora a abordagem mais comum seja o uso Model::select, ela pode causar a renderização de todos os atributos definidos com métodos de acessador nas classes de modelo. Portanto, se você definir o atributo no seu 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);
    }
}

E então use: TableName::select('username')->where('id', 1)->get();

Ele produzirá coleção com ambos first_nameeusername , em vez de apenas com o nome de usuário.

Melhor uso pluck(), solo ou opcionalmente em combinação com select- se você quiser colunas específicas.

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

ou

TableName::where('id', 1)->pluck('username'); // que retornaria uma coleção composta apenas por usernamevalores

Além disso, opcionalmente, use ->toArray()para converter o objeto de coleção em matriz.

Nikola Kirincic
fonte
1

->get()bem como ->all()(e ->first()etc.) pode usar os campos que você deseja trazer de volta como parâmetros;

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

Traria de volta a coleção, mas apenas com column1ecolumn2

Robert Pounder
fonte
1

você também pode usar o findOrFail()método aqui é bom usar

se a exceção não for capturada, uma resposta HTTP 404 será automaticamente enviada de volta ao usuário. Não é necessário escrever verificações explícitas para retornar respostas 404 ao usar esse método, para não gerar um erro 500.

ModelName::findOrFail($id, ['firstName', 'lastName']);
Jignesh Joisar
fonte
1

Se você deseja obter uma única linha e a partir dessa coluna, um código de linha para obter o valor da coluna específica é usar o find()método ao lado da especificação da coluna que você deseja recuperá-la.

Aqui está o código de exemplo:

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

Você pode usar a consulta abaixo:

Table('table')->select('name','surname')->where('id',1)->get();
Luis
fonte
1
Por favor, adicione um pouco de explicação para a sua resposta de forma que outros possam aprender com ele
Nico Haase
0

use App \ Table; ... Table :: where ('id', 1) -> get ('nome', 'sobrenome');

se não onde

Tabela :: all ('nome', 'sobrenome');

عبد الناصر الخمايسة
fonte