来自 3 个一对多表的嵌套 JSON
Posted
技术标签:
【中文标题】来自 3 个一对多表的嵌套 JSON【英文标题】:Nested JSON from 3 one-to-many Tables 【发布时间】: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 BY
和GROUP_CONCAT
更改我的SQL,但这里相同,无法获得我想要的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 );
【讨论】:
谢谢,根据您的回答,我已经接近我想要的服务器响应。实际上,我唯一的错误是 Table3_Objects 数组不起作用。数据没有推送进去,等我找到解决办法再编辑关闭subjet。再次感谢。以上是关于来自 3 个一对多表的嵌套 JSON的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 基础 -- 多表关系(一对一1对多(多对一)多对多)多表查询(内连接外连接自连接子查询(嵌套查询)联合查询 union)笛卡儿积