#php #mysql #laravel
#php #mysql #ларавель
Вопрос:
Панель отладки считывает
368 statements were executed, 360 of which were duplicated, 8 unique
Оказывается, что при каждой проверке моего пользователя, через auth()-gt;user()-gt;isCustomer()
и другие подобные функции, он на самом деле каждый раз ищет пользователя.
т.е.
public function hasRole($role) { // If the user has the 'admin' role, always authorize if ($this-gt;roles()-gt;where('name', 'customer')-gt;first() !== null) { return true; } return null !== $this-gt;roles()-gt;where('name', $role)-gt;first(); } // Check for admin public function isCustomer() { return $this-gt;hasRole('customer'); }
Как безопасно кэшировать эту информацию в объекте пользователя, чтобы база данных не подвергалась преследованию каждый раз?
Я также использую эту 404labfr/laravel-impersonate
функцию в этом проекте (поэтому, когда вы являетесь администратором, вы можете выдавать себя за других пользователей).
Комментарии:
1. охранники кэшируют пользователя, так что это не охранники (аутентификация) … что бы вы
isCustomer
ни делали, это выполнение запроса … это не поиск пользователя каждый раз, когда вы каждый раз просматриваете его роли … используйте динамическое свойство для отношения, чтобы загрузить его и использовать его вместо выполнения нового запроса для поиска по их ролям2. как бы я это сделал, пожалуйста, @lagbox
Ответ №1:
Я думаю, что вы можете уменьшить запросы вдвое, используя:
public function hasRole($role) { return null !== $this-gt;roles()-gt;whereIn('name', ['customer', $role])-gt;first(); }