Laravel:从MySQL查询中获取单个值


Laravel: getting a single value from a MySQL query

我正在尝试使用laravel从MySQL数据库中获取单个值,但是我得到一个数组的问题。 这是我在 MySQL 命令行中的查询结果:

select groupName from users;

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

我的拉拉维尔功能:

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

预期值$data值为 value = 管理员的字符串

但我得到的是:[{"groupName":"Admin"}]

另一个编辑:从版本 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集合和查询的工作方式不同,这就是原因(。

编辑:

对不起,我忘记了pluck()正如许多人评论的那样:最简单的方法是:

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

这将直接以字符串形式返回所请求行的唯一第一个结果。

使用流畅的查询构建器,您无论如何都会获得一个数组。我的意思是查询生成器不知道该查询会返回多少行。这是您可以做的更干净一点

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

first()告诉 queryBuilder 只返回一行,所以没有数组,所以你可以这样做:

return $result->groupName;

希望对你有帮助

从 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 中被标记为已弃用

在 Laravel 5.1 中,pluck从查询的第一个结果中获取单个列的值。

在 Laravel 5.2 中,pluck 得到一个包含给定列值的数组。因此,它不再被弃用,但它不再像以前那样工作。

所以简短的回答是使用 value 函数,如果你想要第一行的一列,并且你使用的是 Laravel 5.1 或更高版本。

感谢Tomas Buteler在评论中指出这一点。

[原文]对于任何遇到这个问题的人,他们正在使用Laravel 5.1,pluck((已被弃用,并将在Laravel 5.2中完全删除。

请考虑改用value()来证明您的代码。

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

使用查询生成器获取单列值,例如 groupName

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

对于拉拉维尔 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 7.x 或 8.x 中的做法

$email = DB::table('users')->where('name', 'John')->value('email');

来源: 相信我

<小时 />

根据扎曼@Shuhad评论更新

在 laravel 5.6 上,它有一个非常简单的解决方案:

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

它将以字符串形式返回组名