Как выбрать определенные столбцы в Laravel Eloquent


139

допустим, у меня есть 7 столбцов в таблице, и я хочу выбрать только два из них, что-то вроде этого

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

В красноречивой модели laravel это может выглядеть так

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

но я предполагаю, что это выражение выберет ВСЕ столбцы, где идентификатор равен 1, и мне нужны только два столбца (имя, фамилия). как выбрать только два столбца?


Спасибо, что задали вопрос. Это безумие, поскольку я всегда делал это правильно в `` классических '' SQL-запросах, но, используя Eloquent, я нашел это настолько запутанным, что был счастлив просто заставить его работать, и не обращал внимания на то, сколько памяти использовали мои запросы, потому что выбирал все.
Джонни Перл,

Ответы:


225

Сделать это можно так:

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

1
Предположим, я хочу выбрать каждое поле, кроме одного, как я могу это сделать
Принц Арора

2
Прежде всего, если у вас есть вопрос, задайте его. А в вашем случае просто укажите все столбцы вместо того, который вы не хотите включать. Это так просто.
Marcin Nabiałek 05

2
разве нет другого способа сделать это без упоминания всех столбцов
Принц Арора

1
Это работает для базового случая с одной таблицей. Однако, если вы используете отношение над сводной таблицей, тогда это ТАКЖЕ автоматически выберет столбцы сводной таблицы.
Benubird 03

1
@OPV Он просто запускает SELECT name, surname FROM Table where id = 1SQL-запрос
Марчин Набялек,

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

Я хочу то же самое, но другим методом. Я хочу выбрать метод, создав экземпляр модели, а затем выберите столбец. т.е. $ model = new MyModel (); $ model-> select (['col1', 'col2']); Но эта штука не работает
Дхирендер

49

Используя метод all (), мы можем выбрать определенные столбцы из таблицы, как показано ниже.

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

Примечание : Laravel 5.4


Я хочу то же самое, но другим методом. Я хочу выбрать метод, создав экземпляр модели, а затем выберите столбец. т.е. $ model = new MyModel (); $ model-> select (['col1', 'col2']); Но это не работает.
Dhirender

37

Вы также можете использовать find()так:

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

$idПеременная может быть массивом в случае , если вам нужно получить несколько экземпляров модели.


24

Также Model::all(['id'])->toArray()он будет получать только идентификатор в виде массива.


17

Сначала вам нужно создать модель, которая представляет эту таблицу, а затем использовать приведенный ниже способ Eloquent для получения данных только из 2 полей.

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

Это лучший ответ, поскольку он работает также со сводными таблицами во многих отношениях.
Лучано

8

Вы можете использовать get (), а также all ()

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

4

Также можно использовать щипцы.

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

6
Обратите внимание, что pluck()он менее эффективен, чем другие обсуждаемые методы, поскольку он не изменяет SELECT ...запрос, а скорее работает с уже возвращенным набором результатов.
Бен Джонсон

4

Получить значение одного столбца:

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

Даже вы можете использовать этот метод с предложением where:

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

в построителе запросов:

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

где cluase:

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

или

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

Результат последнего метода - массив


3

Вы можете использовать Table::select ('name', 'surname')->where ('id', 1)->get ().

Имейте в виду, что при выборе только определенных полей вам придется сделать еще один запрос, если вы в конечном итоге получите доступ к этим другим полям позже в запросе (это может быть очевидно, просто хотел включить это предупреждение). Включение поля id обычно является хорошей идеей, поэтому laravel знает, как записывать любые обновления, которые вы делаете для экземпляра модели.


3

Из laravel 5.3 только с помощью get()метода вы можете получить определенные столбцы своей таблицы:

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

Или из laravel 5.4 вы также можете использовать all()метод для получения полей по вашему выбору:

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

с обоими вышеуказанными методами get()или all()вы также можете использовать, where()но синтаксис отличается для обоих:

Модель :: все ()

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

Модель :: Get ()

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

3

Чтобы получить результат для определенного столбца из таблицы, мы должны указать имя столбца.

Используйте следующий код: -

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

например -

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

Пожалуйста, добавьте пояснение к своему ответу, чтобы другие могли извлечь из него уроки
Нико Хаасе

2

Хотя наиболее распространенный подход заключается в использовании Model::select, он может вызвать отрисовку всех атрибутов, определенных с помощью методов доступа в классах модели. Итак, если вы определяете атрибут в своей модели:

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

А затем используйте: TableName::select('username')->where('id', 1)->get();

Будет выведена коллекция с обоими first_nameиusername , а не только с именем пользователя.

Лучше использовать pluck(), соло или опционально в сочетании с select- если вам нужны определенные столбцы.

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

или

TableName::where('id', 1)->pluck('username'); // что вернет коллекцию, состоящую только из usernameзначений

Также, необязательно, используйте ->toArray()для преобразования объекта коллекции в массив.



1

->get()очень похоже ->all()->first()т. д.) может принимать поля, которые вы хотите вернуть, в качестве параметров;

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

Вернул бы коллекцию, но только с column1иcolumn2


1

вы также можете использовать findOrFail()метод здесь, это хорошо для использования

если исключение не обнаружено, пользователю автоматически отправляется ответ HTTP 404. Нет необходимости писать явные проверки для возврата 404 ответа, когда использование этого метода не дает ошибки 500 ..

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

1

Если вы хотите получить одну строку и из этой строки один столбец, один код строки для получения значения определенного столбца должен использовать find() метод вместе с указанием столбца, который вы хотите получить.

Вот пример кода:

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

0

Вы можете использовать следующий запрос:

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

1
Пожалуйста, добавьте пояснение к своему ответу, чтобы другие могли извлечь из него уроки
Нико Хаасе
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.