如果用户登录Laravel 5.1,我们可以访问用户ID
Auth::user()->id
在我之前的应用程序(不是laravel)中,当用户登录时,我正在为userid注册会话。我正在检查$ _SESSION ['user_id']是否可用。
我想问一下,当我调用Auth::user()->id
时,是否为每个请求生成了sql查询?如果它确实对性能不利。
我应该注册一个像
这样的新会话Session::put('user_id', Auth::user()->id);
表现。
或Auth:user() - > id是最佳选择吗?
答案 0 :(得分:11)
您可以改用Auth::id()
。这会从会话中抓取它。如果会话中不存在,那么它将运行查询并从数据库中获取它。
答案 1 :(得分:0)
这不是一个真正的答案,但它打算展示Auth::id()
的工作原理。将以下路线添加到web.php
:
Route::get('/fake', function () {
\DB::enableQueryLog();
Auth::id();
dump(\DB::getQueryLog());
});
现在,导航到/fake
,结果如下:
array:1 [▼
0 => array:3 [▼
"query" => "select * from `users` where `id` = ? limit 1"
"bindings" => array:1 [▼
0 => 284
]
"time" => 15.37
]
]
我一遍又一遍地尝试了这一点,似乎Auth::id()
总是查询数据库,而不是以某种方式在会话中缓存结果(我使用Laravel 5.6,PHP 7.2.3和MariaDB 10.2.14)。
为了确认,我也启用了MariaDB logging feature,我得到了:
180611 12:08:10 77 Connect user@localhost as anonymous on dbname
77 Query use `dbname`
77 Prepare set names 'utf8mb4' collate 'utf8mb4_unicode_ci'
77 Execute set names 'utf8mb4' collate 'utf8mb4_unicode_ci'
77 Close stmt
77 Prepare set time_zone="+04:30"
77 Execute set time_zone="+04:30"
77 Close stmt
77 Prepare set session sql_mode='NO_ENGINE_SUBSTITUTION'
77 Execute set session sql_mode='NO_ENGINE_SUBSTITUTION'
77 Close stmt
77 Prepare select * from `users` where `id` = ? limit 1
77 Execute select * from `users` where `id` = 284 limit 1
77 Close stmt
77 Quit