Метод laravel first() довольно прост, поэтому этот вопрос может быть глупым, но я не понимаю, как использовать метод first().
На самом деле, я следую учебному пособию на YouTube, где я аутентифицирую пользователя, если у него есть роль admin, тогда только он получит доступ route, в противном случае он будет перенаправлен на home.
Нет ошибки или проблемы с кодом, но я понимаю.
Я возвращаю пользователя в функцию класса модели User, если у пользователя есть роль, переданная промежуточным программным обеспечением.
Маршрут
Route::get('admin', function (){
return 'This is Admin page';
})->middleware(['auth', 'auth.admin']);
ПО промежуточного слоя
public function handle($request, Closure $next)
{
if (Auth::user()->hasAnyRole('admin'))
{
return $next($request);
}
return redirect('home');
}
Пользовательский модальный
public function hasAnyRole($role)
{
return null !== $this->roles()->where('name', $role)->first();
}
Если я использую метод first() в функции hasAnyRole, то только route будет защищен другими пользователями и только admin получит доступ к маршруту,
Если я удалю метод first(), то все пользователи получат доступ к route, чего я не понимаю?






Согласно документам:
The first method returns the first element in the collection that passes a given truth test:
collect([1, 2, 3, 4])->first(function ($value, $key) {
return $value > 2;
});
// 3
You may also call the first method with no arguments to get the first element in the collection. If the collection is empty, null is returned:
collect([1, 2, 3, 4])->first();
// 1
В вашем вопросе, если вы не используете метод first(), он вернет коллекцию без данных, например:
Roles {#1
[]
}
Эта пустая коллекция не равна null.
Об операторе !==
$x !== $y
В предыдущем фрагменте он возвращает true, если $x не равно $y или они не одного типа.
Итак, в вашем коде:
return null !== $this->roles()->where('name', $role)->first();
он вернет true, если (и только если) у пользователя нет требуемой роли, что вы делаете методом first():
$this->roles()->where('name', 'admin')->first();
Если у пользователя нет роли admin, он возвращает null, что идентично и того же типа null (в вашем сравнении). Таким образом, он возвращает false, потому что null !== null возвращает false, и доступ не предоставляется.
Если вы используете что-то вроде
$this->roles()->where('name', 'admin');
и у пользователя нет роли admin, он возвращает что-то вроде этого:
Roles {#1
[]
}
Теперь ваша функция hasAnyRole возвращает true и доступ предоставляется пользователю, так как пустая коллекция не того же типа и также не равна null;
Вы должны отправить этот SQL. Используя
get()илиfirst(). Если вы не используете эти методы, то ваш красноречивый объект никогда не будетnull. Это означает, что вы никогда не получите результатов.