Mutli отношения с Eloquent и Laravel - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть 6 таблиц:

permissions:
id
permission_name

roles:
id
role_name

user_roles:
id 
user_id 
role_id

user_permissions:
id 
user_id 
permission_id

role_permissions:
id
role_id
permission_id

users:
id
username
email

Теперь я хочу добавить пользовательскую функцию в мою модель Eloquent для разрешений с именем getUsersWithPermission () .

Теперь возможно, что у пользователя есть разрешение в соответствии с ролью, которую он дал (пользовательская таблица присоединяется к user_roles, присоединяется к этой таблице в role_permissions и, наконец, эта таблица присоединяется к разрешениям.

Или у пользователя естьопределенный набор разрешений в таблице user_permissions (присоединиться к таблице user_permissions в таблице user и присоединиться к таблице разрешений в таблице user_permissions)

Как создать функцию модели Eloquent, которая возвращает всех пользователей с определенным разрешением: «messages.error.process ", где это имя разрешения

A hasMany не совсем делает то, что я хочу (и я не могу определить там несколько таблиц). Я использую Laravel 5.6.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

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

model ER diagram of your table structure

Чтобы справиться с этой ситуацией, вы можете создать 3 «красноречивых модели»

  1. Пользователь
  2. Роль
  3. Разрешение

в каждой модели вы можете создать belongsToMany() взаимосвязь друг с другом моделей.

один пример, «Модель пользователя»

public function permissions()
{
    // need to define any other differences in your tables foreign keys as  2nd, 3rd parameters and so on.
    return $this->belongsToMany(Permission::class);
}

Теперь вам нужно получить всех пользователей, «у которых есть роль, обладающая привилегией», ИЛИ , которые напрямую имеют привилегию..

для этого.

$users = User::whereHas('privileges', function($query) {
    $query->where('permission_name', 'notification.error.process');
})->orWhereHas('roles.permissions', function($query) {
    $query->where('permission_name', 'notification.error.process');
})->get();

Надеюсь, у вас появится идея.Ваш код может немного отличаться от моего.но это понятие.

0 голосов
/ 29 сентября 2018

Если вы правильно определили свои отношения «многие ко многим» (разрешение пользователя и разрешение роли пользователя), то нужно выполнить следующее:

$permissionName = 'notification.error.process';
$usersWithPermission = User::whereHas('permissions', function($query) use ($permissionName) {
  $query->whereName($permissionName);
})->orWhereHas('roles.permissions', function($query) use ($permissionName) {
  $query->whereName($permissionName);
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...