Laravel中使用sortBy后返回无索引值的集合响应
解决Laravel sortBy返回资源集合带数字索引的问题
方案1:使用values()重置集合键名
Laravel的sortBy方法会保留集合原有的键名,导致转JSON时变成带索引的对象。只需在排序后调用values()方法重置键名,就能得到纯数组格式的响应:
修改代码中的排序逻辑:
$join = Account::with('actype','ledger')->get(); $resource = GetMainLedgersResource::collection($join); $collection = collect($resource); // 排序后调用values()重置键 $data = $collection->sortBy('description')->values(); return response()->json(['ledgers' => $data], 200);
方案2:数据库层面排序(更高效)
如果数据量较大,推荐直接在数据库查询阶段完成排序,避免内存中排序的性能损耗。通过关联表join并按关联字段排序:
$join = Account::with('actype','ledger') ->join('ledgers', 'accounts.ledger_id', '=', 'ledgers.id') ->orderBy('ledgers.description') ->select('accounts.*') // 确保只查询Account表字段,避免字段冲突 ->get(); $resource = GetMainLedgersResource::collection($join); return response()->json(['ledgers' => $resource], 200);
原理说明
sortBy方法仅对集合元素排序,但不会修改原有的键名,因此转JSON时会以对象形式输出(保留原索引)。values()方法会返回一个重新索引的集合,键从0开始递增,转JSON时自然成为纯数组格式。
内容的提问来源于stack exchange,提问作者adithyan.cs
相关产品推荐
相关产品推荐

