Laravel Relationship Union: одна связь с двумя таблицами в модели - PullRequest
0 голосов
/ 03 июля 2018

Давайте предложим этот пейзаж:

У нас есть 3 модели -> Пользователь, Роль и Разрешение.

Отношения

  • Пользователь имеет отношение один ко многим с ролью.
  • Роль имеет много-много отношений с Разрешением
  • У пользователя много-много отношений с Разрешением.

Конечная цель отношений между пользователем и разрешением - переопределить разрешение, назначенное пользователю через его роль. Просто исключение для этого пользователя.

Я пытаюсь что-то вроде этого:

public function permissions () {
    return $this->hasManyThrough('App\Permission', 'App\Role')->merge($this->permissionOverrides);
}

В этом случае, когда я пытаюсь загрузить модель разрешений, Laravel выдает ошибку, потому что разрешения не определяются как отношения.

С другой стороны, что если мы изменим отношение «пользователь - роль» на многие на многие ?

Большое спасибо за ваши знания!

EDIT

Ролевые отношения

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

Отношения разрешения

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

Отношения с пользователем

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

public function permissionOverrides() {
    return $this->belongsToMany('App\Permission')->withTimestamps();
}

Вопрос в том, как сделать отношение permissions(), объединяющее разрешения роли и разрешения пользователя.

ЛУЧШЕ ОБЪЯСНЕНИЕ

Из-за недопонимания, показанного в комментариях, я попытаюсь объяснить это лучше. Я установил все отношения между App \ User и App \ Role; Я также установил отношения между App \ Role и App \ Permission. Я могу сделать прямо сейчас:

$user->role->permissions;

Для получения этого я настроил сводную таблицу Права_роли, которая хранит отношение.

Это не тот случай. Я хочу добавить еще одну переменную в уравнение. Теперь я хочу иметь возможность переопределить разрешения роли, добавив связь между App \ User и App \ Permission. У меня есть сводная таблицаmission_user и установил отношение:

public function permissionsOverride() {
    return $this->belongsToMany('App\Permission');
}

REAL QUESTION - как получить все разрешения (как роли, так и переопределенные разрешения только в ОДНОМ отношении). Я имею в виду объединение обоих отношений.

Почему я хочу объединить отношения? Я мог бы сделать обычную функцию для этого, но я бы хотел загрузить это отношение, Laravel.

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете попробовать вот так, отношение ManyToMany между User и Role, аналогично отношение ManyToMany между Role и Permission.

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

public function roles() {
    return $this->belongsToMany('App\Role', 'user_role')->withTimestamps();
}

public function permissions() {
    return $this->belongsToMany('App\Permission', 'permission_user')->withTimestamps();
}

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

public function users() {
    return $this->belongsToMany('App\User', 'user_role')->withTimestamps();
}

public function permissions() {
    return $this->belongsToMany('App\Permission', 'permission_role')->withTimestamps();
}

Выборочные данные

$user = User::with('permissions','roles','roles.permissions')->find(1);
$permissions = $user->permissions;
foreach($user->roles as $role){
   $permissions->merge($role->permissions); //merger collection
}

dd($permissions->all());

Подробнее можно посмотреть https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

А для Коллекции вы можете посмотреть это https://laravel.com/docs/5.6/collections#method-merge

...