【问题标题】:Nested JSON from 3 one-to-many Tables来自 3 个一对多表的嵌套 JSON
【发布时间】:2012-06-18 07:34:38
【问题描述】:

我正在构建一个 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

Table1 以一对多的关系连接到 Table2 和 Table2 和 Table3 之间。

我想从服务器得到一个嵌套的 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 个商店中,但这将是另一个问题 ;-)

第一个 Store(基于来自 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 中创建一个数组,但无法获得预期结果。 我也尝试使用GROUP BYGROUP_CONCAT 更改我的SQL,但这里相同,无法获得我想要的JSON。

非常感谢您的帮助。

【问题讨论】:

    标签: php mysql sql json sencha-touch-2


    【解决方案1】:

    带有一些示例数据的可运行代码:http://codepad.org/2Xsbdu23

    我使用了 3 个不同的 SELECTs 来避免不必要的重复。 当然,您必须将 $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 );
    

    【讨论】:

    • 谢谢,根据您的回答,我已经接近我想要的服务器响应。实际上,我唯一的错误是 Table3_Objects 数组不起作用。数据没有推送进去,等我找到解决办法再编辑关闭subjet。再次感谢。
    猜你喜欢
    • 2017-07-03
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2022-11-01
    • 2014-09-12
    • 2020-09-07
    • 2018-10-30
    相关资源
    最近更新 更多