Як вибрати конкретні стовпчики красномовними у laravel


138

скажемо, що у мене є 7 стовпців у таблиці, і я хочу вибрати лише два з них, щось подібне

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

У красномовній моделі ларавел це може виглядати приблизно так

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

але я думаю, що цей вираз вибере ВСІ стовпці, де id дорівнює 1, і я хочу лише два стовпці (ім’я, прізвище). як вибрати лише два стовпчики?


Дякуємо, що поставили запитання. Це божевільно, тому що я завжди робив це правильно в "класичних" SQL-запитах, але, використовуючи Eloquent, я вважав це таким заплутаним, що був радий просто працювати, і не звертав уваги на те, скільки пам'яті використовували мої запити, тому що я вибирала все.
Джоні Перл

Відповіді:


224

Ви можете це зробити так:

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

1
припустимо, я хочу вибрати кожне поле, яке очікує, як я можу це зробити
Принц Арора

1
Перш за все, коли у вас виникне питання, запитайте його. А для вашого випадку - просто згадайте всі стовпці замість того, який ви не хочете включати. Це так просто.
Marcin Nabiałek

2
хіба немає іншого способу зробити це без згадування всіх стовпців
Принц Арора

1
Це працює для базового випадку з єдиною таблицею. Однак якщо ви використовуєте співвідношення над зведеною таблицею, то це ТАКОЖ вибере стовпчики, що перетворюються, автоматично.
Benubird

1
@OPV Він просто запускає SELECT name, surname FROM Table where id = 1SQL-запит
Marcin Nabiałek

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

Я хочу те саме, але використовую інший метод. Я хочу вибрати метод, створивши примірник моделі, а потім виберіть стовпчик. тобто $ model = новий MyModel (); $ model-> select (['col1', 'col2']); Але ця справа не працює
Дірндер

49

Використовуючи метод all (), ми можемо вибрати конкретні стовпці з таблиці, як показано нижче.

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

Примітка : Laravel 5.4


Я хочу те саме, але використовую інший метод. Я хочу вибрати метод, створивши примірник моделі, а потім виберіть стовпчик. тобто $ model = новий MyModel (); $ model-> select (['col1', 'col2']); Але ця річ не працює.
Дірндер

37

Ви також можете використовувати find()так:

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

$idЗмінна може бути масивом в разі , якщо вам потрібно отримати кілька екземплярів моделі.



17

Спочатку потрібно створити модель, яка представляє цю таблицю, а потім скористатися наведеним нижче красномовним способом для отримання даних лише з двох полів.

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

Це найкраща відповідь, оскільки вона працює також із зведеними таблицями у багатьох відносинах.
Лучано

8

Ви можете використовувати get (), а також усі ()

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;

Навіть ви можете використовувати цей метод з пунктом де:

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

у конструкторі запитів:

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

з ключем:

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, він може спричинити відображення всіх атрибутів, визначених методами accessor, в межах модельних класів. Тож якщо ви визначите атрибут у своїй моделі:

<?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()метод, тут добре використовувати

якщо виняток не зафіксовано, відповідь 404 HTTP автоматично надсилається користувачеві. Не потрібно писати явні чеки, щоб повернути 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
Будь ласка, додайте пояснення до своєї відповіді, щоб інші могли дізнатися з неї
Ніко Хааз

0

використовувати додаток \ таблицю; ... Таблиця :: де ('id', 1) -> get ('ім'я', 'прізвище');

якщо ні куди

Таблиця :: all ('ім'я', 'прізвище');

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.