Я здесь новенький и очень надеюсь, что не задаю повторяющийся вопрос.

Я совершенно новичок в кодировании и сразу перешел в 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

Промежуточная таблица со столбцами таблицы user_id и role_id

Проблема, с которой я столкнулся, заключается в том, что я хочу создать проверку ролей для пользователя, и я предполагаю, что создание промежуточного программного обеспечения будет лучшим вариантом. Но когда я хочу проверить, есть ли у пользователя роль, со следующим кодом:

if (Auth::user()->roles->name == 'manager')
    {
        // do something here
    }
    else {
        // do something else here
    }

Я получаю сообщение об ошибке, указывающее, что "name" не существует в этом экземпляре коллекции.

Я понял, что могу перебрать роли, которые есть у пользователя, и отобразить их с помощью:

$user = User::find(1);
foreach($user->roles as $role)
{
print $role->name;
}

Но я совершенно не понимаю, почему проверка ролей не работает.

0
Therin 17 Сен 2021 в 13:36

2 ответа

Лучший ответ

Auth::user()->roles - это набор ролей, экземпляр Illuminate \ Database \ Красноречивый \ Коллекция. Итак, для этой проверки вы можете сделать что-то вроде:

if (Auth::user()->roles->contains('name', 'manager') {
    // do something here
} else {
    // do something else here
}
0
Kevin Bui 17 Сен 2021 в 10:43

Поскольку Auth :: user () -> roles возвращает коллекцию всех ролей, поэтому вы не можете применять оператор "==" напрямую

1
Muhammad Taha 17 Сен 2021 в 10:48