Laravel中如何在JSON响应数组内拼接start_date与start_time为start字段
Laravel接口拼接自定义start字段实现方案
要满足将start_date与start_time拼接为指定格式start字段、全量保留原有响应字段的需求,有两种适配不同场景的实现方式:
轻量场景:控制器内直接处理
适合只在当前单个接口需要拼接字段的场景,不需要额外新建文件,直接修改现有控制器逻辑即可,修改后的完整代码如下:
public function calendar(Job $job) { $user = auth()->user(); $calendar = $job->where('user_id', $user->id)->get()->map(function($item) { // 给模型动态追加start属性,不修改数据库存储值 $item->setAttribute('start', trim($item->start_date . ' ' . $item->start_time)); return $item; }); return response()->json($calendar); }
- 该写法直接沿用Laravel集合的遍历能力,所有原有模型字段会随模型实例正常序列化输出,不会出现字段丢失
- 拼接时加
trim()处理,可规避原字段前后多余空格导致的格式偏差,最终输出的start字段完全匹配2021-02-18 12:32:00的格式要求
规范场景:API资源类实现
如果项目有多个接口需要返回该start字段,用Laravel内置的API资源类做统一封装,后续维护更高效:
- 执行命令生成资源类:
php artisan make:resource JobCalendarResource - 修改生成的资源类文件中的
toArray方法,通过合并原有字段+自定义字段的方式实现,不会遗漏原有字段:public function toArray($request) { return array_merge(parent::toArray($request), [ 'start' => trim($this->start_date . ' ' . $this->start_time) ]); } - 修改控制器返回逻辑,用资源类包装查询结果:
public function calendar(Job $job) { $user = auth()->user(); $calendar = $job->where('user_id', $user->id)->get(); return JobCalendarResource::collection($calendar); }
避坑提示
不要手动把所有需要返回的原有字段逐个列在返回数组里,这种写法后续新增数据库字段时极易出现漏配,用动态追加属性或合并父类返回值的方式,能自动同步所有模型字段,减少维护成本。如果存在start_date或start_time为空的异常数据,可在拼接时加判空逻辑,避免出现异常的start值。
内容的提问来源于stack exchange,提问作者Jareer
相关产品推荐
相关产品推荐

