Итак, у меня есть статья и «комментарии» к статье.
комментарий позволяет людям отвечать.. и вы можете ответить на ответ.. и т. д. и т. д., что означает, что самый глубокий корень дерева будет N
Быстрый макет того, как выглядят столы
Comments(id, news_id, user_id, body, likes)
Replies(id, parent_id) --> id here is = Comments.id
User(id, username, password)
News(id, title, body, image)
Есть ли способ запросить базу данных Postgres, чтобы получить результат чего-то вроде
Таким образом, все внутри таблицы Replies
с нулевым parent_id является «основным» комментарием (он же не является ответом). Мне бы хотелось, если это возможно, если поля children
заполнялись внутри себя (т.е. ответ ответа)
Возможно ли это даже с Postgres? Или я должен получать все Replies
, соединяя их с Comments
, а затем перебирать каждый, пытаясь найти правильное назначение?
Кстати, я использую GoLang
для своего бэкэнда и пакет Gorm
для доступа к моей базе данных postgres.
EDIT: я использую этот запрос
with recursive commentss as (
select r.id, r.parent, array[r.id] as all_parents,
c.body, u.username
from replies r
inner join comments c
on c.id = r.id
join users u
on u.id = c.user_refer
where (parent <> '') IS NOT TRUE
union all
select r.id, r.parent, c.all_parents || r.id,
co.body, u.username
from replies r
join comments co
on co.id = r.id
join users u
on u.id = co.user_refer
join commentss c
on r.parent = c.id
and r.id <> ALL (c.all_parents)
)
select * from commentss order by all_parents;
Что приводит к:
Что на шаг ближе... однако мне нужно, чтобы объект JSON возвращался в виде
comments: [
{
comment_id: ...,
username: ...,
comment_body: ....,
comment_likes: ....,
children: [...]
},
{
.....
}
]
Где первыми элементами внутри объекта comments
будут комментарии, которые НЕ являются ответом, а поле children
должно быть заполнено отвеченными комментариями.. и комментарии внутри children
также должны иметь свои children
ответы на этот ответ.