Tôi là tác giả của pg-promise;)
con.task(t => {
const a = post => t.any('SELECT * FROM comment WHERE idPost = $1', post.id)
.then(comments => {
post.comments = comments;
return post;
});
return t.map('SELECT *, avatar FROM post, users WHERE user = $1 AND user = alias ORDER BY time DESC LIMIT 10 OFFSET $2', [username, pos], a)
.then(t.batch);
})
.then(posts => {
res.send(posts);
})
.catch(error => {
console.log(error);
});
Cũng xem câu hỏi này:lấy bảng JOIN dưới dạng mảng kết quả với PostgreSQL / NodeJS.
CẬP NHẬT
Trong trường hợp bạn không muốn sử dụng toàn bộ cách tiếp cận truy vấn JSON, thì giải pháp sau sẽ mở rộng quy mô tốt hơn nhiều so với giải pháp ban đầu, vì chúng tôi nối tất cả các truy vấn con và sau đó thực thi chúng thành một truy vấn:
con.task(async t => {
const posts = await t.any('SELECT *, avatar FROM post, users WHERE user = $1 AND user = alias ORDER BY time DESC LIMIT 10 OFFSET $2', [username, pos]);
const a = post => ({query: 'SELECT * FROM comment WHERE idPost = ${id}', values: post});
const queries = pgp.helpers.concat(posts.map(a));
await t.multi(queries)
.then(comments => {
posts.forEach((p, index) => {
p.comments = comments[index];
});
});
return posts;
})
.then(posts => {
res.send(posts);
})
.catch(error => {
console.log(error);
});
Xem API:
- helpers.concat
- Database.multi