Tôi đang cố ánh xạ kết quả của một truy vấn tới JSON bằng cách sử dụng row_to_json()
hàm đã được thêm vào PostgreSQL 9.2.
Tôi đang gặp khó khăn khi tìm ra cách tốt nhất để biểu diễn các hàng đã nối dưới dạng các đối tượng lồng nhau (quan hệ 1: 1)
Đây là những gì tôi đã thử (mã thiết lập: bảng, dữ liệu mẫu, theo sau là truy vấn):
-- 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$$;
Bản thân truy vấn:
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;
Tôi thấy nếu tôi sử dụng ROW()
, tôi có thể tách các trường kết quả thành một đối tượng con, nhưng nó có vẻ bị giới hạn ở một cấp duy nhất. Tôi không thể chèn thêm AS XXX
câu lệnh, vì tôi nghĩ tôi nên cần trong trường hợp này.
Tôi có đủ khả năng đặt tên cột, bởi vì tôi truyền đến loại bản ghi thích hợp, chẳng hạn với ::user_roles
, trong trường hợp kết quả của bảng đó.
Đây là những gì mà truy vấn trả về:
{
"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"
}
}
}
}
Những gì tôi muốn làm là tạo JSON cho các phép nối (một lần nữa là 1: 1 cũng được) theo cách mà tôi có thể thêm các phép nối và để chúng được biểu diễn dưới dạng đối tượng con của cha mẹ mà chúng tham gia, tức là như sau:
{
"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"
}
}
}
}
Any help is appreciated. Thanks for reading.