YII2中MySQL迁移PostgreSQL后,如何忽略表名与列名大小写?
YII2全局适配PostgreSQL表/列名大小写方案
迁移到PostgreSQL后,由于PostgreSQL默认将未加双引号的表/列名转为小写,无需逐一修改代码,可通过以下全局配置解决:
1. 数据库连接层全局转换表名
在数据库配置文件(如config/db.php)中,针对PostgreSQL的Schema配置自定义表名转换逻辑:
return [ 'class' => 'yii\db\Connection', 'dsn' => 'pgsql:host=localhost;dbname=your_database', 'username' => 'your_user', 'password' => 'your_password', 'charset' => 'utf8', 'schemaMap' => [ 'pgsql' => [ 'class' => 'yii\db\pgsql\Schema', 'defaultSchema' => 'public', // 自动将代码中使用的表名转为小写 'resolveTableName' => function ($tableName) { // 若原代码用驼峰命名,可先转下划线再小写: // return strtolower(\yii\helpers\Inflector::underscore($tableName)); return strtolower($tableName); }, ], ], ];
2. 全局重写ActiveRecord表名规则
创建一个基础ActiveRecord类,让所有业务模型继承它,统一处理表名:
namespace app\models; use yii\db\ActiveRecord; class BaseActiveRecord extends ActiveRecord { public static function tableName() { // 将父类返回的表名强制转为小写 return strtolower(parent::tableName()); } }
之后所有模型都继承BaseActiveRecord,替代原生的ActiveRecord即可。
3. 列名大小写适配
PostgreSQL默认返回的列名为小写,YII2的pgsql驱动会自动映射到模型的属性(模型属性通常为小写或驼峰,可通过attributes()方法调整)。若代码中存在大写列名引用,可在BaseActiveRecord中统一处理:
// 在BaseActiveRecord中添加 public function attributes() { $attributes = parent::attributes(); // 将属性名转为小写,匹配数据库列名 return array_map('strtolower', $attributes); }
注意事项
- 若迁移后的表/列名是通过双引号创建的大小写敏感名称,上述全局转换无效,需确保迁移时未使用双引号,让PostgreSQL自动转为小写。
- 原生SQL语句中的表/列名需手动调整为小写,或通过Schema配置的表名转换逻辑间接处理。
内容的提问来源于stack exchange,提问作者clara
相关产品推荐
相关产品推荐

