【问题标题】:Get user id from session - laravel 5.3 authentication从会话中获取用户 ID - laravel 5.3 身份验证
【发布时间】:2017-05-19 03:48:53
【问题描述】:

我有全新的 Laravel 5.3 安装。只需使用php artisan make:auth 即可开始使用内置的身份验证功能。一切正常,登录后Auth::check()返回true,Auth::user()返回用户数据,Auth::id()给出登录用户的ID。

困扰我的是,当我只有这一行时

$userId = Auth:id();

在调试器面板的“查询”选项卡中,我的控制器操作(并且没有其他与 Auth 关联的其他代码)我看到以下查询

select * from `users` where `users`.`id` = '34' limit 1

这个额外的查询对我来说是非常不受欢迎的(尤其是全选部分),因为我需要用户的 id 来进行查询,从用户表中选择特定字段,以及将其与另一个表连接。出于性能原因,我不想进行双重查询。

那么,有没有办法告诉 Laravel 将登录用户的 id 保存在会话中(如果它没有被保存)并直接从会话中获取登录用户的 id - 无需对数据库进行任何查询。

编辑: 我知道在第一次调用Auth::user() 之后,后续调用不会向数据库发出请求,但是毫无意义,为什么要进行select * 查询,如果我只需要的话数据库中的一些列。至少有办法告诉 Laravel 只选择特定的列,而不是 select * 吗?

谢谢

【问题讨论】:

  • 仅仅因为select * 没有优化就给您的应用程序提供一种获取用户ID 的迂回方式,这让我觉得这是一个谬论。你将在性能和内存使用方面获得微不足道的收益,但最终会因为拥有非标准的 Laravel 应用程序而损失惨重。框架背后的整个想法是易于开发与微管理/微优化。如果你想要这种级别的自定义,我建议你不要使用 Laravel。
  • @TomasButeler,感谢您的建议,但不同意反对 select * 是一种微优化。我认为框架的易于开发不应该影响这样简单任务的性能,并且像 laravel 这样流行的框架应该有这个选项恕我直言
  • 很抱歉,我不同意 Tomas Buteler 的说法。 Laravel 旨在快速启动应用程序,但在定制方面也有一些怪癖。然而,像 Laravel 这样健壮的框架应该是足够动态的,可以让你能够自定义,并且框架足够聪明,可以按照你需要的方式工作……主要是。我正在做的项目我们在服务器端使用 Laravel 100%,我们的项目需要在某种程度上定制 Laravel。您还在哪里调用 Auth() Facade?还是引用 auth??

标签: laravel authentication laravel-5 laravel-5.3


【解决方案1】:

您不需要执行另一个查询。使用此对象获取其他属性:

auth()->user()->name

【讨论】:

  • 感谢您的回答,但它不起作用,这意味着 - 它再次发出 select * 查询。我不想select *,得到所有的列并且只使用一些,纯粹的优化,不是吗?
  • Laravel 总是为登录用户执行一个查询。如果您将使用该对象,它将不会执行另一个查询。如果您想为大多数请求关闭它,恐怕您需要使用自己的或第 3 方身份验证系统。但这没有任何意义,因为 Laravel 也从文件或数据库中读取会话。
  • 我理解的很好,问题是,假设我只需要用户的名字,姓氏和电子邮件,为什么laravel会select *,让select *查询其他的也没用不会使用列
  • Laravel 这样做是因为它很常见。您可以将所有其他列保留在另一个模型/表中(即Profile)并在此模型和User之间创建一对一的关系
  • 人们喜欢 Laravel,因为这些东西开箱即用,适用于大多数应用程序。听到你不喜欢它很难过。
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 2016-02-02
  • 2017-07-15
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2017-05-13
相关资源
最近更新 更多