为什么Laravel 5.8在使用会话时会重复查询数据库

时间:2019-05-29 20:37:10

标签: laravel laravel-5.8

在Laravel 5.8中,与会话一起工作时,与Laravel 5.7相比,对数据库执行了两个额外的查询。

Laravel 5.7

select * from `sessions` where `id` = '00kaQxJLG6roUAp9DaCui7esa31sbthHqEzwW62H' limit 1

Laravel 5.8

select * from `sessions` where `id` = 'anFc8QgnSpMbMVHcuxAldxKdLhNyo3IUNavylQTD' limit 1

update `sessions` set `payload` = 'YTozOntzOjY6Il90b2tlbiI7czo0MDoiQm12QlFHNzVNRVpZcTRkMWZwcmNMS2kwcm12czlvZkpXZUg0cFpEQyI7czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6MTY6Imh0dHA6Ly9kZXYubG9jYWwiO31zOjY6Il9mbGFzaCI7YToyOntzOjM6Im9sZCI7YTowOnt9czozOiJuZXciO2E6MDp7fX19', `last_activity` = 1559161593, `user_id` = '', `ip_address` = '127.0.0.1', `user_agent` = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36' where `id` = 'anFc8QgnSpMbMVHcuxAldxKdLhNyo3IUNavylQTD'

select * from `sessions` where `id` = 'anFc8QgnSpMbMVHcuxAldxKdLhNyo3IUNavylQTD' limit 1

新安装。没有包裹。

3 个答案:

答案 0 :(得分:1)

已解决

在Laravel 5.8中,中间件已更改

Illuminate/Session/Middleware/StartSession.php

在方法句柄中已添加

$this->saveSession($request);

如果已配置会话,则它将在数据库中更新。

仅在Laravel 5.7中使用cookie。

答案 1 :(得分:0)

在开发 Laravel 8 应用程序时,我也遇到了这种情况,幸运的是没有什么可担心的,如下所述:

https://laracasts.com/discuss/channels/laravel/duplicate-session-query

laravel 调试栏的输出

select * from `sessions` where `id` = 'ZGtPxAAAlFsMcZOC4OXnwRRX8n8gf9uWsqeefjoP' limit 1
update `sessions` set `payload` = `sdffbbblablablverylong`
select * from `sessions` where `id` = 'ZGtPxAAAlFsMcZOC4OXnwRRX8n8gf9uWsqeefjoP' limit 1
<块引用>

这意味着在您的应用程序中使用数据库驱动程序进行会话,并使用它来存储一些信息。不,这不是问题。别担心。

-MichalOravec

答案 2 :(得分:-1)

您已两次编写相同的查询。

select * from `sessions` where `id` = 'anFc8QgnSpMbMVHcuxAldxKdLhNyo3IUNavylQTD' limit 1

您可以通过将查询初始化为变量来解决此问题,然后在需要时使用该变量。

$session = select * from `sessions` where `id` = 'anFc8QgnSpMbMVHcuxAldxKdLhNyo3IUNavylQTD' limit 1;

这应该删除重复项。

雄辩的查询

$session = Session::query()->where('id','anFc8QgnSpMbMVHcuxAldxKdLhNyo3IUNavylQTD')->take(1)->get();