You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:46:34