【问题标题】:Laravel: getting a single value from a MySQL queryLaravel:从 MySQL 查询中获取单个值
【发布时间】:2014-11-13 20:48:17
【问题描述】:

我正在尝试使用 laravel 从 MySQL 数据库中获取单个值,但问题是我得到了一个数组。这是我在 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 值为 value=Admin 的字符串

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

【问题讨论】:

  • 这就是数据库的有趣之处,表由行和列组成,就像一个数组......if (!empty($data)) { return $data[0]->groupName; } return null;
  • 现在你为什么要使用 Eloquent,而不是利用 ORM 的优势,而只是像没有 ORM 一样编写查询?
  • $data = DB::table('users')->where('username', $username)->pluck('groupName');
  • @MarkBaker 非常感谢你,它工作得很好,就像这样 return $data[0]->groupName;
  • @MarkBaker 是的,使用 ORM 的第二种方式也可以正常工作,你太棒了。

标签: php mysql sql laravel


【解决方案1】:

编辑:

抱歉,我忘记了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;

希望对你有帮助

【讨论】:

  • 我知道我编辑了答案,我同意 pluck() 在这种情况下是最好的。
  • 在 Laravel 5.2+ 中 pluck() 将始终返回一个数组
  • 在 laravel 5.5 first() 中,最好得到一个结果。这样我们就可以使用 $result->firstname
  • 对于 Laravel >=5.3 的任何人,请看我的回答:stackoverflow.com/a/41545516/6935763
【解决方案2】:

又一次修改:从版本 5.2 开始,pluck不再被弃用,它只是有了新的行为(与 @987654322 相同) @ 以前 - 请参阅下面的旁注):

编辑:从 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 方法从查询中获取 SINGLE 值(Laravel 4.* 和 5.0)。

然后,在 L5.1 中,pluck 被弃用,取而代之的是 value 方法来替换它。

但有趣的是,pluck 实际上从未消失过。相反,它只是获得了全新的行为,并且......弃用了lists 方法..(L5.2) - 这是由查询生成器和集合方法之间的不一致引起的(在 5.1 中,pluck 在集合和查询上的工作方式不同,这就是原因)。

【讨论】:

  • 太棒了!以及如何检查是否找到了该值?喔好吧。我试过isset()
  • pluck 方法尚未被弃用;另一方面,lists 是它的别名。此外,valuepluck 不可互换——pluck 将返回一个请求列的数组(如果给出了第二个参数,则带有一个可选键)而value 将提供第一个结果的值由查询生成器返回。
  • @TomasButeler 这是真的。如果您是 Laravel 新手,请使用适当的 cmets 再次查看答案 :) Laravel 虽然很酷,但通常不遵守自己的标准。
  • 非常真实 :) 感谢您的澄清!
【解决方案3】:

[编辑] pluck 函数的预期输出已从 Laravel 5.1 更改为 5.2。因此为什么it is marked as deprecated in 5.1

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

In Laravel 5.2, pluck 获取包含给定列值的数组。所以它不再被弃用,但它不再像以前那样做。

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

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

[原创] 对于使用 Laravel 5.1 遇到此问题的任何人,pluck() has been deprecated 并将在 Laravel 5.2 中完全删除。

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

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

【讨论】:

  • pluck 尚未被弃用! lists 在 Laravel 5.2 中已弃用,并将在以后的版本中删除,但 pluck 有望继续存在一段时间。
  • @TomasButeler 感谢您指出 Laravel 重新利用了 pluck 函数。我更新了我的答案,详细说明了 5.1 和 5.2 中 pluck 函数之间的差异。
  • 感谢编辑,现在很清楚了。从 5.1 到 5.2 的更新太令人遗憾了……
【解决方案4】:

使用查询生成器,获取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;

【讨论】:

    【解决方案5】:

    从 Laravel >= 5.3 开始,最好的方法是使用 value

    $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 中与数据库表交互的最有效方式。

    【讨论】:

      【解决方案6】:

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

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

      它将返回 groupName 作为字符串。

      【讨论】:

      • 也许,但它仍然会实例化用户。使用->value('groupName') 应该执行SELECT groupname FROM 并直接返回字符串,而不是检索所有用户信息并创建用户对象。
      • 是的,我认为 ->value('groupName') 是更好的方法。
      【解决方案7】:

      继续,下面是您在 Laravel 7.x8.x

      中的操作方法
      $email = DB::table('users')->where('name', 'John')->value('email');
      

      来源:trust me


      根据@Shuhad zaman 评论更新

      【讨论】:

      • 也适用于 Laravel 7x。
      猜你喜欢
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多