Можете да генерирате JSON съдържание директно от MySQL. Ето решение, което работи с MySQL 5.7 или по-нова версия.
Като начало, разгледайте функция JSON_OBJECT()
, който генерира JSON обект за всеки запис в таблицата:
SELECT p.*, JSON_OBJECT('id', id, 'project_name', project_name, 'parent_id', parent_id) jsFROM tbl_projects p;
Предвид вашите примерни данни, това връща:
<предварителен код>| ID | име на проект | родител_идентификатор | js || --- | ------------------ | --------- | -------------------------------------------------- -------------- || 1 | Къщата на Кармайкъл | 0 | {"id":1, "parent_id":0, "project_name":"Carmichael House"} || 2 | Кухня Кармайкъл | 1 | {"id":2, "parent_id":1, "project_name":"Carmichael Kitchen"} || 3 | Баня Кармайкъл | 1 | {"id":3, "parent_id":1, "project_name":"Carmichael Bathroom"} || 4 | Апартамент Дауд | 0 | {"id":4, "parent_id":0, "project_name":"Dowd Apartment"} || 5 | Кухня Дауд | 4 | {"id":5, "parent_id":4, "project_name":"Dowd Kitchen"} |
За да генерираме очаквания изход, ние ще се самоJIN
таблицата, за да намерите детски записи и използвайте обобщаваща функция JSON_ARRAYAGG()
за генериране на вътрешния JSON масив. Допълнително ниво на агрегиране включва всичко в един обект. Както е показано във вашите примерни данни, предположих, че основни проекти имат parent_id =0
и че има само едно ниво на йерархия:
SELECT JSON_OBJECT('projects', JSON_ARRAYAGG(js)) resultsFROM ( SELECT JSON_OBJECT('id', p.id, 'project_name', p.project_name, 'parent_id', p.parent_id, 'children' , JSON_ARRAYAGG( JSON_OBJECT( 'id', p1.id, 'project_name', p1.project_name, 'parent_id', p1.parent_id) ) ) ) js ОТ tbl_projects p LEFT JOIN tbl_projects p1 WHERE p. parent_id =0 GROUP BY p.id, p.project_name, p.parent_id) x
Добив:
<предварителен код>| резултати || -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------ || {"projects":[{"id":1, "children":[{"id":2, "parent_id":1, "project_name":"Carmichael Kitchen"}, {"id":3, "parent_id ":1, "project_name":"Carmichael Bathroom"}], "parent_id":0, "project_name":"Carmichael House"}, {"id":4, "children":[{"id":5, "parent_id":4, "project_name":"Dowd Kitchen"}], "parent_id":0, "project_name":"Dowd Apartment"}]} |