ฉันพยายามแมปผลลัพธ์ของrow_to_json()
คิวรีกับ JSON โดยใช้ฟังก์ชันที่เพิ่มใน PostgreSQL 9.2
ฉันมีปัญหาในการหาวิธีที่ดีที่สุดในการแสดงแถวที่รวมเป็นวัตถุซ้อนกัน (ความสัมพันธ์ 1: 1)
นี่คือสิ่งที่ฉันได้ลอง (รหัสการตั้งค่า: ตารางข้อมูลตัวอย่างตามด้วยแบบสอบถาม):
-- some test tables to start out with:
create table role_duties (
id serial primary key,
name varchar
);
create table user_roles (
id serial primary key,
name varchar,
description varchar,
duty_id int, foreign key (duty_id) references role_duties(id)
);
create table users (
id serial primary key,
name varchar,
email varchar,
user_role_id int, foreign key (user_role_id) references user_roles(id)
);
DO $$
DECLARE duty_id int;
DECLARE role_id int;
begin
insert into role_duties (name) values ('Script Execution') returning id into duty_id;
insert into user_roles (name, description, duty_id) values ('admin', 'Administrative duties in the system', duty_id) returning id into role_id;
insert into users (name, email, user_role_id) values ('Dan', 'someemail@gmail.com', role_id);
END$$;
แบบสอบถามเอง:
select row_to_json(row)
from (
select u.*, ROW(ur.*::user_roles, ROW(d.*::role_duties)) as user_role
from users u
inner join user_roles ur on ur.id = u.user_role_id
inner join role_duties d on d.id = ur.duty_id
) row;
ฉันพบว่าถ้าฉันใช้ROW()
ฉันสามารถแยกฟิลด์ผลลัพธ์ออกเป็นอ็อบเจ็กต์ลูกได้ แต่ดูเหมือนว่าจะ จำกัด ไว้ที่ระดับเดียว ฉันไม่สามารถใส่AS XXX
ข้อความเพิ่มเติมได้เนื่องจากฉันคิดว่าฉันควรจะต้องใช้ในกรณีนี้
ฉันมีชื่อคอลัมน์ที่จ่ายได้เนื่องจากฉันส่งไปยังประเภทระเบียนที่เหมาะสมเช่น::user_roles
ในกรณีของผลลัพธ์ของตารางนั้น
นี่คือสิ่งที่การสืบค้นกลับมา:
{
"id":1,
"name":"Dan",
"email":"someemail@gmail.com",
"user_role_id":1,
"user_role":{
"f1":{
"id":1,
"name":"admin",
"description":"Administrative duties in the system",
"duty_id":1
},
"f2":{
"f1":{
"id":1,
"name":"Script Execution"
}
}
}
}
สิ่งที่ฉันต้องการทำคือสร้าง JSON สำหรับการรวม (อีกครั้ง 1: 1 ก็ใช้ได้) ในลักษณะที่ฉันสามารถเพิ่มการรวมและให้พวกเขาแสดงเป็นวัตถุลูกของพ่อแม่ที่พวกเขาเข้าร่วมเช่นดังต่อไปนี้:
{
"id":1,
"name":"Dan",
"email":"someemail@gmail.com",
"user_role_id":1,
"user_role":{
"id":1,
"name":"admin",
"description":"Administrative duties in the system",
"duty_id":1
"duty":{
"id":1,
"name":"Script Execution"
}
}
}
}
ขอความช่วยเหลือใด ๆ ขอบคุณที่อ่าน.