【发布时间】: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