Laravel Eloquent - запрос сводной таблицы - PullRequest
0 голосов
/ 01 июня 2018

в моем приложении Laravel у меня есть три таблицы базы данных, которые называются пользователи, проекты и роли.Между ними существует отношение m: n, поэтому у меня также есть сводная таблица с именем project_user_role.Сводная таблица содержит столбцы user_id, project_id и role_id.См. Изображение для скриншота из MySQL Workbench.

enter image description here

Мои модели пользователя, проекта и ролевые модели были определены следующим образом, как и в случае с принадлежностью ToMany:

//User model example
public function projects()
{
    return $this->belongsToMany('App\Library\Models\Project', 'project_user_role')->withPivot(['user_id','role_id']);
}

Теперь я могу легко получить проекты аутентифицированного пользователя, такие как:

$user = Auth::user();
$projects = $user->projects;

Ответ выглядит так:

[
  {
      "id": 1,
      "name": "Test project",
      "user_id": 1,
      "created_at": "2018-05-01 01:02:03",
      "updated_at": "2018-05-01 01:02:03",
      "pivot": {
          "user_id": 2,
          "project_id": 17,
          "role_id": 1
      }
  },
]

, но я хотел бы «ввести» информацию о пользователеРоль в ответ Ликат, что:

[
  {
      "id": 1,
      "name": "Test project",
      "user_id": 1,
      "created_at": "2018-05-01 01:02:03",
      "updated_at": "2018-05-01 01:02:03",
      "pivot": {
          "user_id": 2,
          "project_id": 17,
          "role_id": 1
      },
      roles: [
        {
            "id": 1,
            "name": "some role name",
            "display_name": "Some role name",
            "description": "Some role name",
            "created_at": "2018-05-01 01:02:03",
            "updated_at": "2018-05-01 01:02:03",
        }
      ]
  },
]

Возможно ли это?Спасибо

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

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

Есть небольшая неловкостьи в вашей структуре БД, поскольку сводная таблица объединяет три таблицы вместо двух.Хотя я действительно подумаю над этим после того, как на самом деле отвечу на ваш вопрос ...

Итак, вы можете перейти от пользователя к проекту через сводную таблицу.И вы можете перейти от пользователя к роли через свою сводную таблицу.Но то, что вы ищете, - это перейти от Проекта к Роли через эту сводную таблицу.(т.е. ваша желаемая датаграмма показывает, что данные проекта находятся на верхнем уровне с вложенными «ролями».).Это может быть сделано только в том случае, если модель Projects является вашей точкой входа, а не вашим пользователем.

Итак, начните с добавления метода отношения «многие ко многим» в вашу модель проектов с именем roles и выполните свой запрос.как это:

app(Projects::class)->with('roles')->wherePivot('user_id', Auth::user()->getKey())->get()

Что касается структуры, я думаю, что у вас есть небольшое нарушение единоличной ответственности.«Пользователь» представляет отдельное лицо.Но вы также используете его для представления концепции «Участник» проекта.Я считаю, что вам нужна новая таблица Участников, которая имеет отношение один к одному с Пользователем, и связь один к одному с Проектом.Тогда ваша сводная таблица должна быть только множителем между Участником и Ролью и исключить пользователя из нее.

Тогда ваш запрос будет выглядеть так:

Auth::user()->participants()->with(['project', 'roles'])->get()

Это будеттакже предоставьте вам возможность добавить некоторые данные, описывающие такие вещи, как общий статус member.status, когда они стали связаны с этим проектом, когда они покинули этот проект или кем может быть их руководитель (parent_participant_id).

0 голосов
/ 01 июня 2018

Полагаю, да, вы могли бы загружать роли для вашей коллекции проектов, Определить одно и то же отображение в модели проекта

//Project model
public function roles()
{
    return $this->belongsToMany('App\Library\Models\Role', 'project_user_role', 'project_id');
}

И использовать готовую загрузку в отображении вашей пользовательской модели, определенной для проектов

public function projects()
{
    return $this->belongsToMany('App\Library\Models\Project', 'project_user_role')
                ->with('roles')
                ->withPivot(['user_id','role_id']);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...