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

如何将Laravel数据库数据转为适配Vue.js的JSON格式并解决命名冲突?

Laravel 蛇形命名属性转驼峰适配Vue.js的解决方案
  • 方案1:使用API资源类(推荐)
    Laravel官方提供的API资源类可以自定义返回字段的格式,是粒度最灵活的适配方案。
    首先生成资源类:
    php artisan make:resource UserResource
    然后在app/Http/Resources/UserResource.php的toArray方法中定义驼峰字段:

    public function toArray($request)
    {
        return [
            'firstName' => $this->first_name,
            'lastName' => $this->last_name,
            'createdAt' => $this->created_at,
        ];
    }
    

    在控制器中返回时调用资源类即可:
    return new UserResource(User::find(1));
    如果字段较多,可以自己封装蛇形转驼峰的辅助函数,批量处理模型属性,无需逐个手动定义。

  • 方案2:模型添加访问器+追加属性
    适合少量模型、少量字段的场景,不需要修改控制器逻辑。
    在对应模型中添加访问器,并且将驼峰字段追加到JSON输出中:

    // 定义访问器
    public function getFirstNameAttribute()
    {
        return $this->attributes['first_name'];
    }
    
    // 追加驼峰字段到JSON输出
    protected $appends = ['firstName'];
    
    // 可选:隐藏原蛇形字段
    protected $hidden = ['first_name'];
    
  • 方案3:全局响应中间件统一转换
    适合全项目统一输出驼峰字段的场景,无需修改单个模型或资源类。
    首先创建响应中间件:
    php artisan make:middleware ConvertResponseKeysToCamelCase
    在中间件的handle方法中递归转换所有响应键为驼峰:

    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        $content = json_decode($response->getContent(), true);
        
        // 递归转换键为驼峰的逻辑
        $camelContent = $this->arrayKeysToCamel($content);
        
        $response->setContent(json_encode($camelContent));
        return $response;
    }
    

    然后将中间件注册到app/Http/Kernel.php的API中间件组中即可全局生效。

  • 方案4:前端侧接收后转换
    如果后端改造难度大,可以在前端封装响应拦截器,统一将接口返回的蛇形键转为驼峰:
    以Axios拦截器+lodash为例:

    import { camelCase, isObject, isArray } from 'lodash'
    
    // 递归转换对象键为驼峰
    function keysToCamel(obj) {
      if (isObject(obj) && !isArray(obj)) {
        const n = {}
        Object.keys(obj).forEach(k => n[camelCase(k)] = keysToCamel(obj[k]))
        return n
      } else if (isArray(obj)) {
        return obj.map(i => keysToCamel(i))
      }
      return obj
    }
    
    // 添加响应拦截器
    axios.interceptors.response.use(response => {
      response.data = keysToCamel(response.data)
      return response
    })
    

可根据自己的项目规模、改造工作量选择对应的方案,中小型项目推荐用API资源类,大型全栈项目推荐用全局中间件统一处理。

内容的提问来源于stack exchange,提问作者mathnabit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:05