我是node和pg-promise的新手,并且无法弄清楚如何将三个相关查询的结果合并到一个json结果中。
给出三个相关表格:
父实体
create table parent (
id bigint,
name character varying
);
子实体
create table entity_2 (
id bigint,
parent_id bigint,
name character varying
);
孩子和同事之间有多对多的表
create table entity_2_entity_3 (
id bigint,
child_id bigint,
associate_id bigint
);
子表的关联表
create associate (
id bigint,
name character varying
);
我的服务网址是/ api / family / 1(其中1是子ID)
第一个查询是(返回一个结果):
SELECT *
FROM child
WHERE id = $1
(使用子id参数)
第二个查询是(返回0到多个结果):
SELECT a.*
FROM associate a
JOIN child_associate ca ON ca.associate_id = a.id
JOIN child c ON c.id = b.child_id
WHERE c.id = $1
(使用id参数)
第三个查询是(返回子项的父项
SELECT *
FROM parent
where id = $1
(使用上一个查询中子记录中的parent_id)
生成的JSON应该包含一个用于' parent'的条目,一个条目用于' child'以及一个条目的一个条目' follow'。
最好的方法是什么?我已经接近了,但未能做到正确。
提前感谢您的帮助。顺便说一句 - 爱pg承诺!很高兴我决定在node和pg-promise中编写整个back-en应用程序。
====== UPDATE ==
根据另一篇文章,我决定尝试不同的方法 - 使用单个查询并让Postgres返回JSON。这是功能:
var serverFamilyQuery = `SELECT json_build_object( 'id', s.id, 'name', s.name, 'server_environment', (
SELECT json_agg(json_build_object('id', se.id, 'name', se.name))
FROM salt.server_environment se
WHERE se.id = s.id ), 'applications', (
SELECT json_agg(json_build_object('id', ap.id, 'name', ap.name))
FROM salt.application ap
JOIN salt.server_application sa ON sa.application_id = ap.id
WHERE sa.server_id = s.id )
) result
FROM salt.server s
WHERE s.id = $1`
function getServerFamily(req, res, next) {
var serverID = parseInt(req.params.id);
db.one(serverFamilyQuery, [serverID])
.then(data => {
debug('data: %s', data);
res.status(200)
.json({
status: 'success',
data: data,
message: 'Retrieved Application Successfully'
});
})
.catch(function (err) {
return next(err);
});
};
结果如下:
{
"status": "success",
"data": {
"result": {
"id": 1,
"name": "app01",
"server_environment": [
{
"id": 1,
"name": "Via West"
}
],
"applications": [
{
"id": 1,
"name": "SnapApp"
}
]
}
},
"message": "Retrieved Application Successfully"
}
正如我之前提到的,我更希望server_environment,server和application在json中是单独的条目,但至少可以这样做。
答案 0 :(得分:1)
这么简单:
db.task(function* (t) {
const child = yield t.one('SELECT * FROM child WHERE id = $1', 123);
const parent = yield t.one('SELECT * FROM parent WHERE id = $1', child.id);
const associates = yield t.any('SELECT * FROM associate...');
return {child, parent, associates};
})
.then(data => {
// success, data = {child, parent, associates}
})
.catch(error => {
// error
});