【问题标题】:Laravel Is it possible to improve Auth::id() query?Laravel 是否可以改进 Auth::id() 查询?
【发布时间】:2019-03-12 12:39:03
【问题描述】:

在 Laravel 上,运行任何 Auth 函数来检索经过身份验证的用户 Auth::user()Auth::check()Auth::id(),总是会生成以下查询:

select * from `users` where `id` = 1 limit 1

这在很多情况下可能更有效,因为我只是想知道用户是否经过身份验证。

通过使用Auth::id(),查询应至少优化为select id from,而不是select * from

有没有办法避免查询运行或至少改进它?

【问题讨论】:

  • COUNT(*)COUNT(id) 快可能是类似的概念。我不知道,只是一个想法。
  • 使用sessions存储用户数据。
  • @vivek_23 session 是一个选项,但我更愿意依赖 Laravel 正确的身份验证方法。
  • 您确定它在调用 Auth::id() 时使用 'select * from users where id = 1 limit 1' 查询;我怀疑它是否一直在访问 db,它会从任何其他方式获取数据
  • 你能解释一下给定查询的问题吗?如果使用会话来存储 ID,如果 ID 尚未存在于数据库中,它如何进入那里 - 所以 COUNT 将始终返回 1,这样您就可以完全避免该查询

标签: php database laravel laravel-5 laravel-authorization


【解决方案1】:

我发现Auth::id()/auth()->id()的定义是

public function id()
{
    if ($this->loggedOut) {
        return;
    }

    return $this->user()
                ? $this->user()->getAuthIdentifier()
                : $this->session->get($this->getName());
}

这意味着它已经在使用会话了。

现在为了更好地完成这项工作,您可能需要更多地研究 SessionGuardAuth 合同。

【讨论】:

  • 谢谢你的回答@Prafulla 你能告诉我那是什么课吗?也许$this->loggedOut 就是我所需要的,以避免查询数据库。
  • @ToniAlmeida SessionGuard 是类。那是在 Illuminate\Auth 命名空间中。
  • @ToniAlmeida 你有更好的解决方案吗?你能在这里分享你的解决方案吗?
  • 我没有,据我了解 Laravel 将始终检查经过身份验证的用户是否在数据库中(同时用户可能已被删除)。并且通过检查,将始终返回完整的用户数据。就我而言,我只想要 ID,检索所有内容是浪费资源 (select *)。最好有一个简单的方法来只返回 id。
  • @ToniAlmeida 你是对的,你认为有可能吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-11
  • 2014-01-07
  • 2014-06-09
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 2015-11-19
  • 2015-02-26
相关资源
最近更新 更多