Как получить разрешения от пользователя, который имеет несколько ролей в Laravel?

Я создаю новое приложение laravel, в котором у пользователя может быть несколько ролей, и эти роли имеют несколько прав (разрешения). Теперь я хочу получить все разрешения от определенного пользователя.

Я использую Laravel 5.8 и Eloquent. Я могу получить роли от пользователя и разрешения от роли, но не разрешения от пользователя.

 dd(Auth::user()->roles->rights);

Пользователь модели:

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

Роль модели:

    public function users()
    {
        return $this->belongsToMany(User::class);
    }

    public function rights()
    {
        return $this->belongsToMany(Right::class);
    }

Модель справа

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

Я ожидаю получить все разрешения для одного пользователя, прошедшего через его роли.


person Arne    schedule 21.06.2019    source источник
comment
Попробуйте воспользоваться этим stackoverflow.com/questions/56631895/get -user-permissions-list /   -  person mare96    schedule 21.06.2019
comment
Теперь я использую метод загрузки и получаю права, если сбрасываю их, но не могу получить к ним доступ. dd (Auth :: user () - ›load ('roles.rights')); imgur.com/cwK0bXP   -  person Arne    schedule 21.06.2019


Ответы (2)


Поскольку у одного пользователя может быть много ролей, а у одной роли может быть много прав, вам нужно будет перебрать каждую из ролей в цикле.

//Retrieving rights associated with the user
public function retrieveRightsAssociatedWithUser($user){
    $rightsAssociatedWithUser = [];
    foreach($user->roles as $role){
        $rightsAssociatedWithUser[] = $role->rights; 
    }
    return $rightsAssociatedWithUser;
}
person Lizesh Shakya    schedule 21.06.2019
comment
Нет лучшего решения? Мне не нравится делать foreach в foreach, даже если вы можете кэшировать разрешения. На данный момент я использую dd (Auth :: user () - ›load ('roles.rights')); Это дает мне набор прав, но я могу получить к ним доступ - person Arne; 21.06.2019
comment
Нет. Я не знаю других альтернатив для получения данных прямо сейчас. Вы можете загрузить разрешение и роли, чтобы сделать это быстрее. - person Lizesh Shakya; 21.06.2019
comment
Вы можете удалить один foreach и получить все права с помощью одного foreach. Я обновил свой ответ. Пожалуйста, посмотрите - person Lizesh Shakya; 21.06.2019

Вы можете добавить в метод rights () модель User:

public function rights()
    {
        return $this->hasManyThrough(Role::class, Right::class);
    }

а затем используйте $ user-> rights ();


Дополнительная информация: Laravel не думал для многихToMany.

Вы можете установить пакет

composer require staudenmeir/eloquent-has-many-deep

и используйте это:

class User extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function rights()
    {
        return $this->hasManyDeep(Right::class, ['role_user', Role::class]);
    }
}
person Mikhail Solovyan    schedule 21.06.2019
comment
Спасибо за ваш вклад! Если я сделаю это, я получу эту ошибку. SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец «rights.user_id» в «списке полей» (SQL: выберите _1 _. *, _2 _._ 3_ как laravel_through_key из roles внутреннего соединения rights на _7 _._ 8_ = _9 _._ 10_ где rights .user_id = 200) - person Arne; 24.06.2019
comment
@Arne, извините, я запуталась, попробуйте вернуть $ this- ›hasManyThrough (Right :: class, Role :: class); - person Mikhail Solovyan; 24.06.2019
comment
Я заметил вашу маленькую ошибку, но мою проблему это не решило. Я все еще получаю een SQLSTATE-error SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.user_id' in 'field list' (SQL: select rights.*, roles.user_id` как laravel_through_key из rights внутреннего соединения roles на _7 _._ 8_ = _9 _._ 10_, где _11 _._ 12_ = 200) ` - person Arne; 24.06.2019
comment
@Arne, Sorrym Laravel Для многих и многих не досконально, вы можете установить github.com/ staudenmeir / eloquent-has-many-deep и класс использования User расширяет модель {use \ Staudenmeir \ EloquentHasManyDeep \ HasRelationships; разрешения публичной функции () {return $ this- ›hasManyDeep (Permission :: class, ['role_user', Role :: class]); }} - person Mikhail Solovyan; 25.06.2019
comment
Спасибо, я воспользуюсь им в будущем, сейчас я просто напишу свой собственный SQL-оператор, и это сработает. Я посмотрю на ваше решение. - person Arne; 25.06.2019