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

CakePHP如何将PostgreSQL蛇形列名转为驼峰命名后返回JSON?

在CakePHP中实现蛇形列名转驼峰JSON响应

完全可行,不用手动写别名破坏关联,这里给你几个实用方案:

方法1:控制器内递归转换键名

在获取数据后,通过递归函数把蛇形键转成驼峰,关联嵌套的数据也能处理:

// 控制器中获取带关联的数据
$articles = $this->Articles->find()->contain(['Authors'])->all();

// 转换为数组并处理键名
$formattedData = array_map(function ($item) {
    return $this->_snakeToCamel($item->toArray());
}, $articles->toArray());

// 返回JSON响应
$this->set(compact('formattedData'));
$this->viewBuilder()->setOption('serialize', ['formattedData']);

// 辅助函数:递归转换蛇形键为驼峰
private function _snakeToCamel($array) {
    $result = [];
    foreach ($array as $key => $value) {
        $camelKey = \Cake\Utility\Inflector::camelize($key, '_');
        // 处理嵌套的关联数据
        $result[$camelKey] = is_array($value) ? $this->_snakeToCamel($value) : $value;
    }
    return $result;
}

方法2:自定义全局Json视图(推荐多场景使用)

如果多个控制器都需要这个功能,直接写个自定义视图类统一处理:

  1. 创建src/View/JsonCamelCaseView.php:
namespace App\View;

use Cake\View\JsonView;
use Cake\Utility\Inflector;

class JsonCamelCaseView extends JsonView {
    protected function _serialize($data) {
        $formattedData = $this->_convertToCamel($data);
        return parent::_serialize($formattedData);
    }

    private function _convertToCamel($data) {
        if (!is_array($data)) return $data;
        
        $result = [];
        foreach ($data as $key => $value) {
            $camelKey = Inflector::camelize($key, '_');
            $result[$camelKey] = $this->_convertToCamel($value);
        }
        return $result;
    }
}
  1. 在控制器的初始化方法里指定使用这个视图:
public function initialize(): void {
    parent::initialize();
    $this->viewBuilder()->setClassName('JsonCamelCase');
}

之后所有返回JSON的接口都会自动转换键名,关联数据结构也不会被破坏。

方法3:实体类访问器(适合个别字段)

如果只是少数字段需要转换,在实体类里加访问器:

// Article实体类
public function getArticleId() {
    return $this->_get('article_id');
}

// 控制器序列化时指定字段
$this->set('articles', $articles);
$this->viewBuilder()->setOption('serialize', ['articles']);
$this->viewBuilder()->setOption('serializeOptions', [
    'fields' => ['articleId', 'authorId']
]);

这个方法需要手动指定所有字段,适合小范围场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:10:48