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

Laravel 5.8+如何拆分查询结果的cols与rows并返回指定JSON?

解决Laravel REST API返回cols和rows格式JSON的问题

我来帮你搞定这个问题!你的核心需求是把查询结果拆成列名数组(cols)和纯值行数组(rows),但目前的写法有两个关键问题:重复查询数据库,以及错误处理Collection对象导致cols为空。

修正后的代码

// 只查询一次数据库,获取目标数据集合
$records = Dd_hr::take(2)->get();

// 获取列名:若集合非空,取第一条记录的键作为列名
$cols = $records->isNotEmpty() ? array_keys($records->first()->toArray()) : [];

// 将每条记录转换为纯值数组(仅保留值,去掉键名)
$rows = $records->map(function ($record) {
    return array_values($record->toArray());
})->toArray();

// 返回符合要求的JSON响应
return response()->json([
    'cols' => $cols,
    'rows' => $rows
], 201);

问题原因拆解

  1. cols为空的根源:你之前用get_object_vars(Dd_hr::take(2)->get()),但get()返回的是Illuminate\Database\Eloquent\Collection对象,get_object_vars获取的是Collection内部的属性(比如存储数据的items),而非模型的字段名,因此array_keys得到空数组。
  2. rows是对象数组的原因:直接返回get()的结果时,Laravel会把每个模型实例序列化成带键名的对象格式,而你需要的是仅包含值的二维数组。

额外优化:指定返回字段

如果你不想返回rn这类额外字段,可以在查询时直接指定需要的列,这样cols和rows都会只保留你需要的数据:

// 仅查询id和user_name字段
$records = Dd_hr::select('id', 'user_name')->take(2)->get();

// 后续逻辑和上述一致
$cols = $records->isNotEmpty() ? array_keys($records->first()->toArray()) : [];
$rows = $records->map(fn($r) => array_values($r->toArray()))->toArray();

return response()->json(['cols' => $cols, 'rows' => $rows], 201);

调整后输出就会和你期望的完全一致:

{"cols":["id", "user_name"],"rows":[["710206","user"], ["710207","user"]]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:45