Laravel красноречивые отношения между двумя отношениями

Надеюсь, вы уловили мою мысль о моем титуле, хе-хе. Вот чего я хочу добиться.

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

class User extends Model {

     ....

     public function roles() {
         return $this->belongsToMany('App\Models\Roles');
     }


     public function permissions() {
         return $this->belongsToMany('App\Models\Permissions');
     }

}

и это работает нормально, но я хочу иметь еще одну функцию, подобную этой

    ....

    public function permissions_by_roles() {

    }

    ....

Потому что у каждого пользователя есть индивидуальные разрешения и разрешения, которые наследуются от ролей. Я хочу получить список разрешений пользователя в зависимости от ролей пользователя. Как я могу этого добиться? Вот мои таблицы:

users
roles
permissions
role_user - contains all roles of each user(ex. admin, super admin, user)
permission_user - contains all permissions of each user (ex. edit, delete)
permission_role  - contains all permissions for each roles.

Надеюсь, кто-нибудь мне поможет. Заранее спасибо! :)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
147
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При необходимости вы можете использовать отношение hasManyThrough в сочетании со слиянием:

class User extends Model {

     ....

     public function roles() {
         return $this->belongsToMany('App\Models\Roles');
     }


     public function permissions() {
         return $this->belongsToMany('App\Models\Permissions');
     }

     public function inheritedPermissions() {
         return $this->hasManyThrough('App\Models\Permissions', 'App\Models\Roles');
     }    
}

Затем, если вам нужны все разрешения пользователя, вы можете:

 $user = User::with(["permissions", "inheritedPermissions"])->where("id", $id)->first();

Все разрешения будут:

$allPermissions = $user->permissions->merge($user->inheritedPermissions)->unique("id");

Это именно то, что я ищу! Ты спас меня, хе-хе, большое спасибо !!

aiipee 21.05.2018 11:52

@aiipee Если пользовательские разрешения являются исключением, а не правилом, то альтернативой тому, что вы делаете, является полное удаление таблицы permission_user, а когда вам нужно добавить определенные разрешения для одного пользователя, просто создайте новую роль, которая называется что-то вроде UserXPermissionRole. и предоставить эту роль только пользователю X. Если вы сделаете это, вы также можете отбросить связь permissions и оставить только inheritedPermission

apokryfos 21.05.2018 12:48

какая хорошая идея! Я сделаю это, большое спасибо за ваше предложение! :)

aiipee 22.05.2018 04:46

Оценил очень! Спасибо за помощь, я надеюсь, что вы также можете помочь мне с моими будущими проблемами, связанными с laravel, хе-хе! Спасибо!

aiipee 22.05.2018 04:53

Другие вопросы по теме