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

Laravel中如何将关联表查询结果转为嵌套JSON结构

实现嵌套JSON结构的几种方案

方案1:利用Eloquent模型关联(推荐)

这是最贴合Laravel设计思想的实现方式,无需手动处理结果结构。

  1. 在Table1模型中定义与Table2的一对一关联:
// app/Models/Table1.php
public function tab2()
{
    // 根据实际外键关系调整参数,比如外键在table2中对应table1的id字段
    return $this->hasOne(Table2::class, '关联外键字段', 'table1.id');
}
  1. 通过关联查询直接生成嵌套结构:
Table1::with('tab2')
    ->where(// 你的查询条件)
    ->select('id', 'name')
    ->get()
    ->toArray();

查询结果会自动包含tab2嵌套对象,完全匹配你期望的结构。

方案2:手动遍历处理查询结果

如果不想定义模型关联,可以在查询后用map方法逐个处理结果:

$result = Table1::leftJoin(// 你的连接条件)
    ->select('table1.id', 'table1.name', 'table2.tab2id', 'table2.tab2name')
    ->get()
    ->map(function ($item) {
        $array = $item->toArray();
        // 提取table2字段到嵌套数组
        $array['tab2'] = [
            'tab2id' => $array['tab2id'] ?? null,
            'tab2name' => $array['tab2name'] ?? null,
        ];
        // 删除原平级的table2字段
        unset($array['tab2id'], $array['tab2name']);
        return $array;
    })
    ->toArray();

适合临时处理、不需要复用关联逻辑的场景。

方案3:查询阶段构造嵌套结构(依赖MySQL 5.7+)

利用MySQL的JSON函数,在查询时直接生成嵌套字段:

$result = Table1::leftJoin(// 你的连接条件)
    ->select(
        'table1.id',
        'table1.name',
        DB::raw('JSON_OBJECT("tab2id", table2.tab2id, "tab2name", table2.tab2name) as tab2')
    )
    ->get()
    ->map(function ($item) {
        // 将JSON字符串转为数组格式
        $item->tab2 = json_decode($item->tab2, true);
        return $item->toArray();
    })
    ->toArray();

内容的提问来源于stack exchange,提问作者Test Test

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:15:39