Laravel: получение одного значения из запроса MySQL


Я пытаюсь получить одно значение из базы данных MySQL с помощью laravel, но проблема в том, что я получаю массив. это результат моего запроса в командной строке MySQL:

select groupName from users;

+-----------+
| groupName |
+-----------+
| Admin     |
+-----------+

Моя функция laravel:

public static function PermitAddNewUser(){
    $username=Session::get('key');
    $data=DB::select("select groupName from users where username='$username';");
    return $data; 
}

Ожидаемое значение $data представляет собой строку со значением= Admin

Но то, что я получаю, это : [{"groupName":"Admin"}]

Author: Wanderer, 0000-00-00

6 answers

Изменить:

Извините, я забыл о pluck(), как многие прокомментировали : Самый простой способ:

Возвращает БД::таблица ('пользователи')->где ('имя пользователя', $имя пользователя)->выщипывать ('Имя группы');

, который напрямую вернет только первый результат для запрошенной строки в виде строки.

Используя конструктор запросов fluent, вы все равно получите массив. Я имею в виду, что конструктор запросов понятия не имеет, сколько строк вернется из этого запроса. Вот что вы можете сделать, чтобы сделать это немного очиститель

$результат = БД::таблица ('пользователи')->выбрать ('Имя группы')->где ('имя пользователя', $имя пользователя)->первый();

Первый() указывает построителю запросов возвращать только одну строку, чтобы не было массива, поэтому вы можете сделать:

Возвращает $результат->Имя группы;

Надеюсь, это поможет

 30
Author: elfif, 2014-09-19 09:59:57

Еще одно изменение: Начиная с версии 5.2 pluck является больше не устаревшим, он просто получил новое поведение (такое же, как и lists ранее - см. Примечание ниже):

Редактировать: Начиная с версии 5.1 pluck устарел, поэтому начните использовать value вместо:

DB::table('users')->where('username', $username)->value('groupName');    

// valid for L4 / L5.0 only
DB::table('users')->where('username', $username)->pluck('groupName');

Это вернет единственное значение поля groupName первой найденной строки.


ПРИМЕЧАНИЕ СБОКУ рег. Комментарий @Tomasbuteler: Поскольку Laravel не следуйте разумному управлению версиями, иногда бывают такие случаи. На момент написания этого ответа у нас был метод pluck для получения ОДНОГО значения из запроса (Laravel 4.* & 5.0).

Затем, с L5.1 pluck устарел, и вместо этого мы получили метод value для его замены.

Но, чтобы сделать это забавным, pluck на самом деле никогда не исчезал. Вместо этого он просто получил совершенно новое поведение и... устаревший метод lists.. (L5.2) - это было вызвано несоответствием между построителем запросов и Методы сбора (в 5.1 pluck по-разному работали с коллекцией и запросом, вот в чем причина).

 37
Author: Jarek Tkaczyk, 2016-04-27 01:08:49

Начиная с Laravel>=5.3, лучший способ - использовать значение :

$groupName = \App\User::where('username',$username)->value('groupName');

Или

use App\User;//at top of controller
$groupName = User::where('username',$username)->value('groupName');//inside controller function

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

 7
Author: Learner, 2017-03-20 11:11:21

[ РЕДАКТИРОВАТЬ] Ожидаемый результат функции pluck изменился с Laravel 5.1 на 5.2. Следовательно, почему помечен как устаревший в 5.1

В Ларавеле 5.1, pluck возвращает значение одного столбца из первого результата запроса.

В Ларавеле 5.2, pluck возвращает массив со значениями данного столбца. Так что он больше не является устаревшим, но он больше не делает того, что делал раньше.

Поэтому короткий ответ - используйте функцию value, если вы требуется один столбец из первой строки, и вы используете Laravel 5.1 или выше.

Спасибо Томасу Бутелеру за указание на это в комментариях.

[ ОРИГИНАЛ] Для всех, кто сталкивается с этим вопросом, кто использует Laravel 5.1, pluck() устарел и будет полностью удален в Laravel 5.2.

Рассмотрите возможность будущей проверки вашего кода с помощью value() вместо этого.

return DB::table('users')->where('username', $username)->value('groupName');
 5
Author: Maxime Rainville, 2016-04-26 20:44:25

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

  $groupName = DB::table('users')->where('username', $username)->pluck('groupName');

Для Laravel 5.1

 $groupName=DB::table('users')->where('username', $username)->value('groupName');

Или, используя пользовательскую модель, получите значение в одном столбце

 $groupName = User::where('username', $username)->pluck('groupName');

Или получите первую строку, а затем разделите ее для получения значения в одном столбце

 $data = User::where('username', $username)->first();
 if($data)
   $groupName=$data->groupName;
 2
Author: Majbah Habib, 2016-07-30 05:59:29

На laravel 5.6 у него есть очень простое решение:

User::where('username', $username)->first()->groupName;

Он вернет Имя группы в виде строки.

 0
Author: MD. Shafayatul Haque, 2018-08-29 12:23:21