как получить sql результат в виде объектов - PullRequest
0 голосов
/ 01 мая 2020

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

Table USER 
id
name
email
Table CAMPUS
id
user_id (foreign key)
name 
Table POST
id
title
user_id (foreign key)

Пользователь принадлежит кампусу, а сообщение принадлежит пользователю. Я хочу написать запрос для извлечения сообщений внутреннего соединения с внутренним соединением пользователя с кампусом.

Результат, который я получаю:

[{ 
id
username
campus name
title
... 
}]

Все в одном объекте. Вместо этого я хочу, чтобы вложенные объекты были такими:

[{
post_title:
post_id:
...
User: {id name... }
campus:{id name ...}

}]

Таким образом, пользователь и кампус наследуются в посте в соответствии с внешними ключами. Как я могу добиться этого с сырым sql? Должен ли я разобрать это позже?

1 Ответ

1 голос
/ 01 мая 2020

Вы можете использовать функции join и json для получения ожидаемого результата.

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

select 
    json_object(
        'id',     p.id
        'title',  p.title
        'user',   json_object('id', u.id, 'name', u.name),
        'campus', json_object('id', c.id, 'name', c.name)
    ) post_object
from posts p
inner join users u on u.id = p.user_id
inner join campus c on c.user_id = u.id

Это дает вам набор результатов с одним столбцом и одной записью на пост в виде объекта json, который содержит вложенные объекты, представляющие пользователя и кампус.

Если вы хотите получить результат с одной строкой и все строки, помещенные в массив json, вы можете использовать json_arrayagg() поверх этого:

select json_arrayagg(
    json_object(
        'id',     p.id
        'title',  p.title
        'user',   json_object('id', u.id, 'name', u.name),
        'campus', json_object('id', c.id, 'name', c.name)
    ) 
) all_posts_objects
from posts p
inner join users u on u.id = p.user_id
inner join campus c on c.user_id = u.id
...