2012-06-15 14 views
4

我正在構建一個Sencha-Touch 2應用程序,並且我從服務器端(mysql數據庫)恢復數據時遇到了一些問題。從3個一對多表嵌套的JSON

這裏是我的數據模型:

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請求獲取嵌套的JSON。

其實在PHP文件我的SQL的要求很簡單:

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

我想從我的SQL結果使得在PHP中的數組,但不能獲得期望的結果。 我也嘗試改變我的SQL與GROUP BYGROUP_CONCAT但在這裏相同,不能得到我想要的JSON。

一些幫助將非常感激。

回答

1

可運行代碼與一些示例數據:http://codepad.org/2Xsbdu23

我用3個不同的SELECT s到避免不必要的重複。 當然,你必須自定義$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); 
+0

謝謝你根據你的回答我接近我想要的服務器響應。 其實,我唯一的錯誤是無法正常工作的Table3_Objects數組。數據未被推入。 當我找到解決方案時,我將編輯並關閉subjet。 再次感謝。 – Greezer