Yii2数据库连接配置有五种方法:一、通过config/db.php单独定义并引入;二、在config/web.php中内联配置;三、配置多个数据库连接并指定组件ID;四、配置主从分离架构;五、通过环境变量动态注入敏感凭证。

如果您在 Yii2 项目中无法执行数据库查询或 ActiveRecord 报错“Unknown Component ID: db”,则很可能是数据库连接未正确注册到应用组件中。以下是配置 Yii2 数据库连接的多种方法:
一、在 config/db.php 中单独定义并引入
该方式将数据库配置集中管理,便于多环境切换与复用。需确保 config/web.php(或 config/main.php)中通过 require 引入该文件,并将其赋值给 components['db'] 键。
1、在 config/db.php 文件中编写标准连接数组,返回包含 class、dsn、username、password 的配置:
2、在 config/web.php 的 components 区域添加:'db' => require(__DIR__ . '/db.php'),
3、验证是否生效:在任意控制器中执行 var_dump(Yii::$app->db);,应输出 yii\db\Connection 实例对象。
二、直接在 config/web.php 的 components 中内联配置
适用于简单项目或快速调试场景,避免额外文件依赖。所有数据库连接参数直接写入主配置文件的 components 数组内,结构清晰且立即生效。
1、打开 config/web.php,定位到 components 数组;
2、插入 db 键,值为完整连接配置数组,例如:
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test;charset=utf8mb4',
'username' => 'root',
'password' => getenv('DB_PASSWORD') ?: 'root',
'charset' => 'utf8mb4',
],
3、确认该配置位于 components 数组内部,且未被注释或包裹在条件判断外。
三、配置多个数据库连接
当项目需同时访问多个数据库(如业务库 + 日志库 + 统计库),可通过为每个连接分配唯一组件 ID(如 db2、logdb、statdb)实现隔离使用,各模型可指定其专属连接。
1、在 config/web.php 的 components 中新增第二个连接项,ID 不得为 db,例如:
'logdb' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=logs',
'username' => 'logger',
'password' => 'logpass',
],
2、在对应模型类中重写 getDb() 方法,显式返回该连接:
public static function getDb()
{
return Yii::$app->get('logdb');
}
3、调用时使用该模型的 ActiveRecord 查询,例如 LogEntry::find()->all() 将自动使用 logdb 连接。
四、配置主从分离数据库
该方式用于读写分离架构,所有写操作走 master,读操作按策略分发至 slave,提升高并发下的数据库吞吐能力。Yii2 原生支持此模式,无需第三方扩展。
1、在 components 中定义一个 db 组件,class 仍为 yii\db\Connection,但结构升级为含 master/slave 配置的对象;
2、设置 masters 数组,每个元素为一个主库 DSN 配置,例如:
'masters' => [[
'dsn' => 'mysql:host=master1;dbname=app',
'username' => 'rw_user',
'password' => 'rw_pass',
]],
3、设置 slaves 数组,每个元素为一个从库 DSN 配置,例如:
'slaves' => [[
'dsn' => 'mysql:host=slave1;dbname=app',
'username' => 'ro_user',
'password' => 'ro_pass',
], [
'dsn' => 'mysql:host=slave2;dbname=app',
'username' => 'ro_user',
'password' => 'ro_pass',
]],
4、执行读操作(如 find()、count())时,Yii2 自动路由至 slave;执行 save()、delete() 等写操作时,强制使用 master。
五、通过环境变量动态注入敏感凭证
避免将数据库密码硬编码在配置文件中,提高安全性。利用 getenv() 函数从系统环境或 .env 文件中提取值,实现配置与凭证分离。
1、在服务器或本地环境中设置环境变量,例如 Linux 下执行:
export DB_PASSWORD="my_secure_pass"
2、在数据库配置中使用 getenv() 获取,若未设置则提供默认值(仅限开发环境):
'password' => getenv('DB_PASSWORD') ?: 'root',
3、部署至生产环境前,确保环境变量已由运维流程注入,且配置中无明文密码残留。











