@yazux

Как правильно сделать выборку со связью многие ко многим?

Добрый день!
Долго использовал Laravel Eloquent ORM и уже подзабыл SQL, сейчас в силу событий требуется написать запрос на чистом SQL и с этим у меня возникла проблема.
БД используется PostgreSQL 9.5

Есть следующие таблицы:
user:
- id
- name
-------------
role
- id
- name
-------------
user_role
- id
- user_id
- role_id
-------------
Связи между таблицами соответсвенно установлены.

Требуется получить список пользователей и их ролей. То есть на выходе должно быть следующее:
[
  {
     id: 1,
     name: "user_name_1"
     roles: [
        {
           id: 1,
           name: "role_name_1"
        },
        {
           id: 2,
           name: "role_name_2"
        }
     ]
  },
  {
     id: 2,
     name: "user_name_2"
     roles: [
        {
           id: 2,
           name: "role_name_2"
        },
        {
           id: 3,
           name: "role_name_3"
        }
     ]
  },
]


Сейчас написал такой запрос:
SELECT user.id, user.name, array_agg(user_role.role_id) as role_id FROM user JOIN user_role ON user_role.user_id=user.id WHERE users.id IN (1,2) GROUP BY users.id


На выходе получаю следующее, что не совсем то, что нужно:
[
  {
    id: 1,
    name: "user_name_1",
    role_id: "1,2"
  },
  {
    id: 2,
    name: "user_name_2",
    role_id: "2,3"
  }
]


Подскажите пожалуйста как написать правильный запрос.
  • Вопрос задан
  • 136 просмотров
Решения вопроса 1
@Yan-s
Желаемый результат не получить на выходе RAW запроса. Когда вы строите запрос через ORM, eloquent может сделать несколько запросов, затем проходится по полученным результатам в цикле и собирается всё в один результирующий объект. То есть получение нужной вам структуры объекта лежит на стороне сервера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы