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);
问题原因拆解
- cols为空的根源:你之前用
get_object_vars(Dd_hr::take(2)->get()),但get()返回的是Illuminate\Database\Eloquent\Collection对象,get_object_vars获取的是Collection内部的属性(比如存储数据的items),而非模型的字段名,因此array_keys得到空数组。 - 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
相关产品推荐
相关产品推荐

