Jak wybrać określone kolumny w laravel eloquent

158

powiedzmy, że mam 7 kolumn w tabeli i chcę wybrać tylko dwie z nich, coś takiego

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

W elokwentnym modelu laravel może to wyglądać tak

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

ale myślę, że to wyrażenie wybierze WSZYSTKIE kolumny, w których identyfikator jest równy 1, a chcę tylko dwie kolumny (imię, nazwisko). jak wybrać tylko dwie kolumny?

devnull Ψ
źródło
Dzięki, że zadałeś pytanie. To szalone, ponieważ zawsze robiłem to poprawnie w `` klasycznych '' zapytaniach SQL, ale gdy musiałem używać Eloquent, uznałem to za tak zagmatwane, że byłem szczęśliwy, że działa, i nie wiedziałem, ile pamięci zajmowały moje zapytania, ponieważ ja wybierał wszystko.
Jonny Perl

Odpowiedzi:

248

Możesz to zrobić w ten sposób:

Table::select('name','surname')->where('id', 1)->get();
Marcin Nabiałek
źródło
1
załóżmy, że chcę wybrać każde pole, spodziewaj się jednego, jak mogę to zrobić
Prince Arora
2
Przede wszystkim, kiedy masz pytanie, zadaj jedno. A w Twoim przypadku - po prostu wymień wszystkie kolumny zamiast tej, której nie chcesz uwzględniać. To takie proste.
Marcin Nabiałek
2
nie ma innej metody na zrobienie tego bez wspominania o wszystkich kolumnach
Prince Arora,
1
Działa to w przypadku podstawowego przypadku z pojedynczym stołem. Jeśli jednak używasz relacji w tabeli przestawnej, spowoduje to RÓWNIEŻ automatyczne wybranie kolumn przestawnych.
Benubird
1
@OPV Po prostu uruchamia SELECT name, surname FROM Table where id = 1zapytanie SQL
Marcin Nabiałek
74
Table::where('id', 1)->get(['name','surname']);
Utkarsh Pandey
źródło
1
Chcę tego samego, ale używając innej metody. Chcę wybrać metodę, tworząc wystąpienie modelu, a następnie wybierz kolumnę. tj. $ model = new MyModel (); $ model-> select (['col1', 'col2']); Ale to nie działa
Dhirender
55

Używając metody all () możemy wybrać poszczególne kolumny z tabeli, jak pokazano poniżej.

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

Uwaga : Laravel 5.4

Sivakumar Tadisetti
źródło
Chcę tego samego, ale używając innej metody. Chcę wybrać metodę, tworząc wystąpienie modelu, a następnie wybierz kolumnę. tj. $ model = new MyModel (); $ model-> select (['col1', 'col2']); Ale to nie działa.
Dhirender
46

Możesz także użyć w find()ten sposób:

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

$idZmienna może być tablicą w przypadku trzeba pobrać wiele wystąpień modelu.

Sammie
źródło
3
To powinna być wybrana odpowiedź.
Armin
25

Ponadto Model::all(['id'])->toArray()pobierze tylko identyfikator jako tablicę.

user3888958
źródło
20

Najpierw musisz utworzyć model, który reprezentuje tę tabelę, a następnie użyj poniższego elokwentnego sposobu, aby pobrać dane tylko z 2 pól.

Model::where('id', 1)
         ->pluck('name', 'surname')
         ->all();
Mahesh Yadav
źródło
To najlepsza odpowiedź, ponieważ działa również w przypadku tabel przestawnych w wielu lub wielu relacjach.
Luciano Fantuzzi
10

Możesz użyć get (), a także all ()

ModelName::where('a', 1)->get(['column1','column2']);
aleXela
źródło
5

Uzyskaj wartość jednej kolumny:

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

możesz użyć tej metody z klauzulą ​​where:

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

lub użyj tej metody, aby ominąć PhpStorm „Metoda nie została znaleziona w App \ Models”:

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

w konstruktorze zapytań:

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

z gdzie cluase:

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

lub

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

ostatnim wynikiem metody jest tablica

Mostafa Asadi
źródło
4

Możesz także użyć zrywki.

Model::where('id',1)->pluck('column1', 'column2');
bereket gebredingle
źródło
6
Należy zauważyć, że pluck()jest to mniej wydajne niż inne omówione metody, ponieważ nie modyfikuje SELECT ...zapytania, ale raczej działa na już zwróconym zestawie wyników.
Ben Johnson,
4

Z laravel 5.3 tylko przy użyciu get()metody można uzyskać określone kolumny tabeli:

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

Lub z laravel 5.4 możesz również użyć all()metody na zdobycie wybranych pól:

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

z obydwoma powyższymi metodami get()lub all()możesz również użyć, where()ale składnia jest inna dla obu:

Model :: all ()

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

Model :: get ()

YourModelName::where('id',1)->get(['id', 'name']);
Haritsinh Gohil
źródło
4

Aby otrzymać wynik konkretnej kolumny z tabeli, musimy podać nazwę kolumny.

Użyj następującego kodu: -

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

na przykład -

$result = DB::Table('Student')->select('subject','class')->where('id',1)->get();  
Jitender Sharma
źródło
Dodaj wyjaśnienie do swojej odpowiedzi, aby inni mogli się z niej czegoś nauczyć
Nico Haase
3

Możesz użyć Table::select ('name', 'surname')->where ('id', 1)->get ().

Pamiętaj, że wybierając tylko dla niektórych pól, będziesz musiał wykonać kolejne zapytanie, jeśli w końcu uzyskasz dostęp do tych innych pól później w żądaniu (co może być oczywiste, po prostu chciałem uwzględnić to zastrzeżenie). Uwzględnienie pola id jest zazwyczaj dobrym pomysłem, więc laravel wie, jak odpisać wszelkie aktualizacje, które wykonujesz w instancji modelu.

Josh Rumbut
źródło
3
use App\Table;
// ...
Table::where('id',1)->get('name','surname');

jeśli nie, gdzie

Table::all('name','surname');
عبد الناصر الخمايسة
źródło
2

Możesz również użyć findOrFail()tutaj metody, którą dobrze jest zastosować

jeśli wyjątek nie zostanie przechwycony, odpowiedź HTTP 404 jest automatycznie wysyłana z powrotem do użytkownika. Nie jest konieczne pisanie jawnych kontroli w celu zwrócenia odpowiedzi 404, gdy użycie tej metody nie daje błędu 500.

ModelName::findOrFail($id, ['firstName', 'lastName']);
Jignesh Joisar
źródło
2

Chociaż najbardziej powszechnym podejściem jest użycie Model::select, może spowodować renderowanie wszystkich atrybutów zdefiniowanych za pomocą metod akcesorów w klasach modelu. Jeśli więc zdefiniujesz atrybut w swoim modelu:

<?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);
    }
}

A następnie użyj: TableName::select('username')->where('id', 1)->get();

Wyprowadzi kolekcję z zarówno nazwą użytkownika, jak first_namei username, a nie tylko.

Lepsze użycie pluck(), solo lub opcjonalnie w połączeniu z select- jeśli chcesz mieć określone kolumny.

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

lub

TableName::where('id', 1)->pluck('username'); // co zwróci kolekcję składającą się tylko z usernamewartości

Opcjonalnie użyj również ->toArray()do konwersji obiektu kolekcji na tablicę.

Nikola Kirincic
źródło
1

->get()podobnie jak ->all()(i ->first()itp.) może przyjmować pola, które chcesz przywrócić jako parametry;

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

Przywróciłby kolekcję, ale tylko z column1icolumn2

Robert Pounder
źródło
1

Jeśli chcesz uzyskać pojedynczy wiersz, a z tego wiersza jedną kolumnę, jeden kod linii, aby uzyskać wartość określonej kolumny, to użycie find()metody obok określenia kolumny, którą chcesz pobrać.

Oto przykładowy kod:

ModelName::find($id_of_the_record, ['column_name'])->toArray()['column_name'];
Brane
źródło
0

Możesz użyć poniższego zapytania:

Table('table')->select('name','surname')->where('id',1)->get();
Luis
źródło
1
Dodaj wyjaśnienie do swojej odpowiedzi, aby inni mogli się z niej czegoś nauczyć
Nico Haase
0

ModelName :: find ($ id, ['imię', 'nazwisko']);

Abeldlp
źródło