Laravel控制器分组后数组键结构转换需求
Laravel 按日期重组拜访计划数据结构
你当前的查询已经完成按日期分组的逻辑,但需要对分组后的集合做格式转换,以得到包含tanggal(日期)和event(门店列表)的目标结构。
原查询代码
$data = DB::table('visit_plan') ->join('outlets', 'outlets.id', '=', 'visit_plan.id_outlet') ->select('outlets.id', 'outlets.name') ->get() ->groupBy(function($date) { return $this->attributes['date'] = Carbon::parse($date->date)->format('Y-m-d'); }); $data = $data->reverse();
当前输出结构
{ "2023-08-29": [ { "id": "0e2b7c5b-c8d4-4c03-bec8-69d9eeeb7e4b", "name": "Basura Mall" }, { "id": "0e2b7c5b-c8d4-4c03-bec8-69d9eeeb7e4b", "name": "TRANSMART KOKAS" } ] }
修改后的实现代码
只需在分组后通过map遍历集合,将每个键值对重组为目标格式的对象:
$data = DB::table('visit_plan') ->join('outlets', 'outlets.id', '=', 'visit_plan.id_outlet') ->select('outlets.id', 'outlets.name', 'visit_plan.date') // 必须选中date字段,否则分组时无法获取日期值 ->get() ->groupBy(function($item) { return Carbon::parse($item->date)->format('Y-m-d'); }) ->reverse() ->map(function($events, $date) { return [ 'tanggal' => $date, 'event' => $events ]; }) ->values() // 移除原日期键,转为索引数组(不需要的话可省略) ->all();
最终输出结构
[ { "tanggal": "2023-08-29", "event": [ { "id": "01dfcdef-691c-43aa-a167-cb91b153a7e8", "name": "Bassura Mall " }, { "id": "d494cdf4-7c79-4e7a-9761-c37203b7ba9c", "name": "TRANSMART KOKAS" } ] } ]
关键提示
- 原查询遗漏了
visit_plan.date字段的选中,必须补充才能正常获取日期进行分组; map方法负责将每个分组的日期键和门店列表,重组为包含指定字段的结构;values()用于将集合的日期键转换为索引下标,输出纯数组结构,不需要保留原键时可省略。
内容的提问来源于stack exchange,提问作者Agis R Herdiana
相关产品推荐
相关产品推荐

