yii多数据库支持按版本差异显著:yii1.1需重载getdbconnection()并扩展基类;yii2.0通过配置多组件及模型静态getdb()指定连接,支持读写分离;yii3.0依赖di容器注入dbal连接,废弃全局yii::$app访问。

Yii 不同版本对多数据库的支持方式差异明显,核心区别在于配置结构、组件注册机制和 ActiveRecord 的数据库绑定逻辑。下面按版本分述关键实现方式:
Yii 1.1:手动注册 + 重载 getDbConnection()
Yii 1.1 没有原生多数据库组件自动注入机制,需显式声明并手动切换。
- 在 main.php 的
'components'中定义多个数据库组件,如'db'、'db1'、'db2',每个必须指定'class' => 'CDbConnection' - 不能直接在模型里写
Yii::app()->db1,因为 ActiveRecord 默认只认db;需创建基类(如Sub1ActiveRecord),重载getDbConnection()方法返回Yii::app()->db1 - 各业务模型继承该基类,而非直接继承
CActiveRecord - 原生查询可用
Yii::app()->db1->createCommand(...)->queryAll()
Yii 2.0:组件配置 + 模型级 db 属性覆盖
Yii 2.0 支持多数据库组件注册,且 ActiveRecord 可通过静态 getDb() 方法灵活指定连接。
- 在 config/db.php 或 config/web.php 的
'components'中定义多个连接,如'db'、'db_new',类型为yii\db\Connection - Gii 生成 Model 时,可在“Database Connection ID”字段填写对应组件名(如
db_new),Gii 会自动生成含public static function getDb()的模型 - 也可手动在模型中覆盖
getDb():return Yii::$app->get('db_new'); - 支持主从读写分离配置:在单个
db组件内设置'slaves'数组,框架自动路由读请求到从库
Yii 3.0:依赖注入 + Dbal 配置驱动
Yii 3.0 彻底转向 PSR-11 容器和模块化设计,数据库连接由 DBAL(Database Abstraction Layer)统一管理,不再依赖全局 Yii::$app。
- 数据库连接通过
yiisoft/db包配置,每个连接作为独立服务注册进 DI 容器,例如db、db-reporting - 模型不再继承 ActiveRecord(已移除),改用基于查询构建器或 Repository 模式;数据库实例通过构造函数注入或容器获取
- 典型写法:
$connection = $container->get(ConnectionInterface::class . '::reporting'); - 无全局
Yii::$app->db_xxx写法,所有连接需显式声明依赖关系,更利于测试与解耦
不复杂但容易忽略:版本升级时,数据库连接逻辑不是简单复制粘贴就能迁移的,尤其 Yii 3.0 彻底放弃静态访问模式,必须重构数据访问层。











