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"}]
6 answers
Изменить:
Извините, я забыл о pluck(), как многие прокомментировали : Самый простой способ:
Возвращает БД::таблица ('пользователи')->где ('имя пользователя', $имя пользователя)->выщипывать ('Имя группы');
, который напрямую вернет только первый результат для запрошенной строки в виде строки.
Используя конструктор запросов fluent, вы все равно получите массив. Я имею в виду, что конструктор запросов понятия не имеет, сколько строк вернется из этого запроса. Вот что вы можете сделать, чтобы сделать это немного очиститель
$результат = БД::таблица ('пользователи')->выбрать ('Имя группы')->где ('имя пользователя', $имя пользователя)->первый();
Первый() указывает построителю запросов возвращать только одну строку, чтобы не было массива, поэтому вы можете сделать:
Возвращает $результат->Имя группы;
Надеюсь, это поможет
Еще одно изменение: Начиная с версии 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
по-разному работали с коллекцией и запросом, вот в чем причина).
Начиная с 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.
[ РЕДАКТИРОВАТЬ]
Ожидаемый результат функции 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');
Используя конструктор запросов, получите значение одного столбца, например Имя группы
$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;
На laravel 5.6 у него есть очень простое решение:
User::where('username', $username)->first()->groupName;
Он вернет Имя группы в виде строки.