如何修改Laravel集合键名 将snake_case转为camelCase返回JSON
多对多关联模型输出驼峰键名JSON实现方案
方案1:模型基类全局配置(优先选,维护成本最低)
不用手动逐字段写map,也不会改动模型原始存储的属性内容,仅在序列化为数组/JSON输出时自动转换格式,嵌套的多对多关联数据会自动递归处理,一次配置所有模型生效。
在所有模型继承的基类文件(通常是app/Models/Model.php)中加入以下代码:
/** * 关闭默认蛇形属性序列化规则 */ public static $snakeAttributes = false; public function toArray() { $snakeArray = parent::toArray(); return $this->recursiveCamelConvert($snakeArray); } /** * 递归转换数组键为驼峰格式 */ protected function recursiveCamelConvert(array $data): array { $converted = []; foreach ($data as $key => $value) { // 遇到嵌套数组就递归处理,覆盖关联数据场景 if (is_array($value)) { $value = $this->recursiveCamelConvert($value); } // 蛇形转驼峰逻辑 $camelKey = lcfirst(str_replace('_', '', ucwords($key, '_'))); $converted[$camelKey] = $value; } return $converted; }
这个方案不影响日常代码里的属性访问:不管写$model->name_last还是$model->nameLast都能正常取到值,只有调用toArray()、toJson()或者直接把模型返回为响应的时候才会输出驼峰键名。
方案2:单场景临时转换(不改动全局逻辑时使用)
如果不想调整全局模型配置,只需要在当前接口返回时做格式转换,可以单独写一个通用递归转换函数,处理最终输出的数据即可,完全不会改动原始模型/集合的内容:
/** * 递归将数组所有键名转为驼峰 */ function camelCaseArrayKeys(array $data): array { $result = []; foreach ($data as $key => $value) { $value = is_array($value) ? camelCaseArrayKeys($value) : $value; $camelKey = lcfirst(str_replace('_', '', ucwords($key, '_'))); $result[$camelKey] = $value; } return $result; } // 调用示例:把模型转数组后传入函数处理即可 $returnData = camelCaseArrayKeys($remitterDetails->toArray());
处理完的$returnData就是外层、嵌套关联层全驼峰键名的结构,直接返回成JSON响应就行。
注意点
之前尝试的手动map写法有几个明显问题:
- 需要手动枚举所有字段,后续表结构新增字段必须同步修改map代码,维护成本极高
- 嵌套层级多的时候要写多层嵌套map,代码冗余易出错
- 很容易漏掉模型追加的访问器字段、关联字段,导致返回数据缺项
以上两种方案都是在输出环节做格式转换,不会修改原始模型、集合的内部属性,完全满足不改动原始集合内容的要求。
内容的提问来源于stack exchange,提问作者Rohannn Singh
相关产品推荐
相关产品推荐

