Laravel中关联两张表:如何将第二表数据作为结果的嵌套属性
如何将关联查询结果转换为嵌套结构数据
嘿,我懂你想要的那种嵌套对象结果!首先得明确一点:原生SQL本身返回的是扁平的二维表行数据,关联查询后自然会把两张表的字段合并到同一行里。要得到你期望的嵌套结构,主要有两种可行的方案:
方案1:在应用层组装嵌套结构
这是最通用的做法,不管用什么数据库都能实现。思路是先执行关联查询拿到扁平结果,再用代码把数据组装成嵌套格式。
举个JavaScript的例子(其他语言逻辑类似):
假设你从数据库查询到的扁平结果是这样的数组:
const flatRows = [ { no: 1, name: 'shoe', type: 1, color: 'red', size: 'big' } ];
然后用代码转换:
const nestedResult = flatRows.map(row => { return { no: row.no, name: row.name, type: row.type, info: { color: row.color, size: row.size } }; });
这样nestedResult就是你想要的嵌套结构了。
方案2:利用数据库的JSON函数直接生成嵌套结果
如果你的数据库支持JSON函数(比如MySQL 5.7+、PostgreSQL等),可以直接在SQL里构造出嵌套的JSON对象,减少应用层的代码量。
以MySQL为例,你可以用JSON_OBJECT()函数来拼接嵌套结构:
SELECT a.no, a.name, a.type, JSON_OBJECT('color', b.color, 'size', b.size) AS info FROM stores a INNER JOIN types b ON a.type = b.type WHERE a.no = 1 AND a.type = 1;
这个查询会返回一行数据,其中info字段是一个JSON格式的字符串(比如{"color": "red", "size": "big"}),你只需要在应用里把这个JSON字符串解析成对象即可。
如果想直接得到完整的嵌套JSON对象,可以把所有字段都包在JSON_OBJECT()里:
SELECT JSON_OBJECT( 'no', a.no, 'name', a.name, 'type', a.type, 'info', JSON_OBJECT('color', b.color, 'size', b.size) ) AS nested_data FROM stores a INNER JOIN types b ON a.type = b.type WHERE a.no = 1 AND a.type = 1;
执行这个SQL后,nested_data字段就是你想要的完整嵌套对象的JSON字符串。
补充说明:你之前写的SQL用了隐式连接(逗号分隔表),建议改成显式的INNER JOIN,这样代码可读性更高,也更符合现代SQL的写法哦。
内容的提问来源于stack exchange,提问作者Niko Modric
相关产品推荐
相关产品推荐

