Ý tưởng cơ bản là truy vấn của bạn nên mong đợi json của bạn được cấu trúc theo một cách nhất định, nếu không nó sẽ thực sự phức tạp. và để xây dựng lại nó với thông tin bổ sung bằng cách sử dụng json_build_object
và json_agg
.
WITH tab_properties_with_expanded_data_type AS (
SELECT
content_type.id AS content_type_id,
tab.name AS tab_name,
json_agg(
-- re-build the property object, but with additional data_type information
json_build_object(
'name', property.name,
'order', property.order,
'help_text', property.help_text,
'description', property.description,
'data_type', json_build_object('id', data_type.id, 'html', data_type.html)
)
) AS tab_properties
FROM content_type,
json_to_recordset(content_type.tabs) AS tab(name TEXT, properties JSON),
json_to_recordset(tab.properties) AS property(name TEXT, "order" INTEGER, help_text TEXT, description TEXT, data_type INTEGER)
LEFT JOIN data_type ON data_type.id = property.data_type
GROUP BY
content_type.id,
tab.name
)
SELECT
tab_properties_with_expanded_data_type.content_type_id AS id,
json_agg(
-- rebuild the tab object
json_build_object(
'name', tab_properties_with_expanded_data_type.tab_name,
'properties', tab_properties_with_expanded_data_type.tab_properties
)
)
FROM tab_properties_with_expanded_data_type
GROUP BY
tab_properties_with_expanded_data_type.content_type_id
Điều này hoạt động nhưng rất hạn chế về tính linh hoạt:Tôi phải liệt kê rõ ràng mọi trường tab và thuộc tính của bạn và tôi mong rằng tài liệu sẽ có một cấu trúc cụ thể. Nhưng đó là một khởi đầu tốt :)