Как получить доступ к множественным отношениям «многие ко многим» в Laravel 6/7 - PullRequest
1 голос
/ 18 марта 2020

Доброго времени суток всем,

У меня есть 3 модели, а именно: Пользователь, Роль и Разрешение.
Пользователь имеет отношение многие ко многим с Роль
Роль имеет отношение многие ко многим с разрешением

У меня есть 5 таблиц, пользователи, роль, роль_пользователя, разрешение, разрешение_рол

Мой вопрос: Есть ли способ в модели пользователя для доступа ко всем разрешениям назначены роли пользователя?

Спасибо всем.

Код:

Модель пользователя

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

     public function permissions()
     {
           //how can i get all permissions of the user
     }
}



Ролевая модель

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

     public function permissions()
     {
           return $this->belongsToMany(Permission:class);
     }
}



Разрешение модели

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

1 Ответ

0 голосов
/ 18 марта 2020

Попробуйте это:

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

     public function permissions()
     {
           $permissionList = [];

           foreach($this->roles as $role){
               foreach($role->permissions as $permission){
                   if(!in_array($permission->name, $permissionList){
                       $permissionList[] = $permission->name
                   }
               }
           }

           return $permissionList;
     }
}

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

О, и я помню, что вы также можете использовать вложенную нетерпеливую загрузку , чтобы вы могли называть свое разрешение внутри роли, например $user->with('roles.permissions')->get(), но, конечно, вы должны сначала выполнить итерацию по отношению ролей чтобы получить данные о разрешениях.

...