Вложенный JSON из 3 таблиц один-ко-многим

Я создаю приложение Sencha-Touch 2, и у меня есть некоторые проблемы с восстановлением моих данных со стороны сервера (mysql DB).

Вот моя модель данных:

Table1 : ID:int description:varchar(100) Table2 : ID:int description:varchar(100) table1_ID:int Table3 : ID:int name:varchar(100) info:varchar(100) table2_ID:int 

Таблица 1 присоединяется к Таблице 2 с отношением «один ко многим», а также между таблицами 2 и таблицей 3.

То, что я хочу от сервера, – это вложенный JSON, который выглядит так:

 [ Table1_object1_ID: 'id' : { Table1_object1_description: 'description', Table2_Objects : [ 'Table2_object1': { Table2_object1_id : 'id', Table2_object1_description : 'description' Table3_Objects : [ table3_object1: { Table3_object1_name : 'name', Table3_object1_info : 'info', }, table3_object2: { Table3_object2_name : 'name', Table3_object2_info : 'info', }, table3_object3: { Table3_object3_name : 'name', Table3_object3_info : 'info', }, etc... ], }, 'Table2_object2': { Table2_object2_id : 'id', Table2_object2_description : 'description' Table3_Objects : [ ... ] }, etc.... ] }, Table1_object2_ID: 'id' : { etc.... ] 

В моем приложении я использую 3 модели для каждой таблицы, и в идеале я хочу сохранить свои данные в 3 магазинах, но это будет другая проблема 😉

Первый магазин (на основе модели из Table1 ) JsonP запрос JsonP для получения JsonP JSON.

На самом деле мой запрос SQL в файле PHP прост:

 SELECT * FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.table1_ID INNER JOIN Table3 ON Table2.ID = Table3.table2_ID; 

Я попытался сделать массив в PHP из моих SQL-результатов, но не смог получить результат ожидания. Я также пытаюсь изменить свой SQL с помощью GROUP BY и GROUP_CONCAT но здесь же, я не могу получить JSON.

Некоторая помощь будет действительно оценена.

Управляемый код с некоторыми примерными данными: http://codepad.org/2Xsbdu23

Я использовал 3 отдельных SELECT чтобы избежать ненужных повторений. Конечно, вы должны настроить массив $result в свой желаемый формат JSON, но я думаю, что это не так сложно.

 // assume $t1/2/3 will be arrays of objects $t1 = SELECT Table1.* FROM Table1 WHERE Table1.ID = 111 $t2 = SELECT Table2.* FROM Table2 WHERE Table2.table1_ID = 111 $t3 = SELECT Table3.* FROM Table2 INNER JOIN Table3 ON Table2.ID = Table3.table2_ID WHERE Table2.table1_ID = 111 function array_group_by( $array, $id ){ $groups = array(); foreach( $array as $row ) $groups[ $row -> $id ][] = $row; return $groups; } // group rows from table2/table3 by their parent IDs $p2 = array_group_by( $t2, 'table1_ID' ); $p3 = array_group_by( $t3, 'table2_ID' ); // let's combine results: $result = array(); foreach( $t1 as $row1 ){ $row1 -> Table2_Objects = isset( $p2[ $row1 -> ID ]) ? $p2[ $row1 -> ID ] : array(); foreach( $row1 -> Table2_Objects as $row2 ) $row2 -> Table3_Objects = isset( $p3[ $row2 -> ID ]) ? $p3[ $row2 -> ID ] : array(); $result[] = $row1; } echo json_encode( $result );