Laravel Проверка отношений «Многие ко многим» с помощью промежуточной таблицы

#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.