You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:48:28