#php #laravel #eloquent #eloquent-relationship
Вопрос:
я здесь новичок и очень надеюсь, что не задаю дублирующий вопрос.
Я совершенно новичок в кодировании и сразу перешел на Laravel, но теперь столкнулся с проблемой, на которую я не совсем нахожу ответ.
У меня есть следующая настройка модели:
User.php
public function roles()
{
return $this->belongsToMany(Role::class, 'user_roles')->as('roles')->withTimestamps();
}
Role.php
Имеет столбец таблицы «имя»
public function users()
{
return $this->belongsToMany(User::class, 'user_roles');
}
UserRole.php
Промежуточная таблица со столбцами таблицы «идентификатор пользователя» и «идентификатор роли»
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу создать проверку ролей для пользователя, и я предполагаю, что создание промежуточного программного обеспечения будет правильным решением. Но когда я хочу проверить, есть ли у пользователя роль со следующим кодом:
if (Auth::user()->roles->name == 'manager')
{
// do something here
}
else {
// do something else here
}
Я получаю сообщение об ошибке, указывающее, что » имя » не существует в этом экземпляре коллекции.
Я понял, что могу перебирать роли, которые есть у пользователя, и отображать их с помощью:
$user = User::find(1);
foreach($user->roles as $role)
{
print $role->name;
}
Но я совершенно не понимаю, почему проверка ролей не работает.
Комментарии:
1. Вот так ?
Auth::user()->roles()->where('name', 'manager')->first();
2. Этот способ, похоже, тоже работает, но я не совсем уверен, почему это ->роли() вместо ->>роли и ->>>первое() дополнение
3. Когда вы используете функцию, она возвращает QueryBuilder, а не коллекцию. Поэтому вместо того, чтобы получать все и сортировать, он сортирует в запросе и извлекает первый экземпляр.
4. О, хорошо, это имеет смысл, тай, за объяснение 🙂
Ответ №1:
как Auth::user()->роли возвращает коллекцию всех ролей, поэтому вы не можете применить оператор «==» напрямую
Ответ №2:
Auth::user()->roles
представляет собой набор ролей, экземпляр IlluminateБаза данныхКрасноречиваяКоллекция. Поэтому для этой проверки вы, возможно, захотите сделать что-то вроде:
if (Auth::user()->roles->contains('name', 'manager') {
// do something here
} else {
// do something else here
}
Комментарии:
1. Это отлично работает, Тай ! Я не совсем видел функцию contains.