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视图(推荐多场景使用)
如果多个控制器都需要这个功能,直接写个自定义视图类统一处理:
- 创建
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; } }
- 在控制器的初始化方法里指定使用这个视图:
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
相关产品推荐
相关产品推荐

