我有新的 Laravel 5.3 安装。只需使用
php artisan make:auth
即可开始使用内置的身份验证功能。一切正常,登录后 Auth::check()
返回 true,Auth::user()
返回用户的数据,Auth::id()
给出登录用户的 ID。
令我困扰的是,当我只有这一行时
$userId = Auth:id();
在调试器面板的“查询”选项卡中我的控制器操作(并且其他地方没有与身份验证相关的其他代码)中,我看到以下查询
select * from `users` where `users`.`id` = '34' limit 1
这个额外的查询对我来说是非常不受欢迎的(尤其是全选部分),因为我需要用户的 id 来进行查询,从用户表中选择特定字段,以及将其与另一个表连接。出于性能原因,我不想进行双重查询。
那么,有没有办法告诉 Laravel 将登录用户的 id 保存在会话中(如果没有保存)并直接从会话中获取登录用户的 id - 而不对数据库进行任何查询。
编辑:我知道在第一次
Auth::user()
调用之后,后续调用不会向数据库发出请求,但是这是没有意义的,如果我只需要数据库中的某些列,为什么要进行 select *
查询。至少有办法告诉 Laravel 仅选择特定列,而不是 select *
?
谢谢
非常古老的主题,但这是我在不调用数据库的情况下检索登录用户 ID 的解决方案:
request()->session()->get(Auth::getName())
Auth::getName() 返回身份验证会话值,该值是会话对象中用户 ID 的键。
您不需要执行另一个查询。使用这个对象来获取其他属性:
auth()->user()->name