Как мне установить глубокие отношения в Eloquent? - PullRequest
1 голос
/ 19 июня 2020

Рассмотрим следующую модель мира:

  • Пользователь может быть участником нуля или более групп пользователей
  • Группа пользователей может иметь ноль или более членов группы пользователей
  • A Репо может находиться в ноль или более RepoGroup
  • RepoGroup может содержать ноль или более Repos
  • Группе пользователей может быть предоставлен доступ «для чтения» или «записи» к RepoGroup

(упрощенная) схема базы данных, реализующая эту модель, выглядит следующим образом:

Database schema

Настройка связи Eloquent многие-ко-многим между пользователем и UserGroup через таблицу user_group_pivot проста, как и эквивалентные отношения между Repo и RepoGroup. Таблица access_rights - это сводная таблица с дополнительной информацией о доступе, но отношения между ClientGroup и RepoGroup также являются отношениями «многие ко многим» и одинаково прямолинейны. Теперь остаются следующие проблемы:

  1. Отношения между UserGroup и Repo
  2. Отношения между RepoGroup и User
  3. Отношения между User и Repo

Это код, который у меня есть на данный момент:

class User extends Model {
    public function userGroups() {
        return $this->belongsToMany(UserGroup::class, 'user_group_pivot');
    }

    public function repos() {
        # Eloquent wizard can makez magic here?
    }

    public function repoGroups() {
        # Eloquent wizard can makez magic here?
    }
}

class UserGroup extends Model {
    public function users() {
        return $this->belongsToMany(User::class, 'user_group_pivot');
    }

    public function repos() {
        # Eloquent wizard can makez magic here?
    }

    public function repoGroups() {
        return $this->belongsToMany(RepoGroup::class, 'access_rights')
            ->withPivot(['access']);
    }

}

class RepoGroup extends Model {
    public function repos() {
        return $this->belongsToMany(Repo::class, 'repo_group_pivot');
    }

    public function users() {
        # Eloquent wizard can makez magic here?
    }

    public function userGroups() {
        return $this->belongsToMany(UserGroup::class, 'access_rights')
            ->withPivot(['access']);
    }
}

class Repo extends Model {
    public function repoGroups() {
        return $this->belongsToMany(RepoGroup::class, 'repo_group_pivot');
    }

    public function repos() {
        # Eloquent wizard can makez magic here?
    }

    public function repoGroups() {
        # Eloquent wizard can makez magic here?
    }
}

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

1 Ответ

0 голосов
/ 19 июня 2020

Существует возможность go в репозиторий, не затрагивая другие отношения.

Вы можете добавить следующий код в User::repos

$repos = [];
foreach($user->userGroups() as $userGroup){
   foreach($userGroup->repoGroups() as $repoGroup){
       foreach($repoGroup->repos() as $repo){
          $repos[] = $repo;
   }
}

Если вы беспокоитесь о производительности (пример во время обработки большого количества пользователей) вы можете использовать активную загрузку во время выборки пользователей с репозиториями из БД

$users = App\User::with(['userGroups.repoGroups.repos'])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...