codeigniter 4 支持多数据库配置:在.env中用前缀(如db1_、db2_)定义多组连接参数,再于app/config/database.php中通过env()读取并声明多个数据库组(如'default'、'reports'),使用时通过db('reports')或$dbgroup指定。

CodeIgniter 4 的 .env 文件本身不直接支持“多库配置”——它只负责定义环境变量,数据库连接等具体配置仍由 PHP 类(如 app/Config/Database.php)控制。但你可以通过 .env 定义多个数据库的参数,再在 Database.php 中按需读取、实例化多个数据库组。
1. 在 .env 中定义多个数据库连接参数
用前缀区分不同库,例如 DB1_、DB2_ 或 MYSQL_MAIN_、MYSQL_LOG_。每组至少包含:主机、用户名、密码、数据库名、端口、字符集(可选)。
DB1_HOST=localhostDB1_USERNAME=rootDB1_PASSWORD=DB1_DATABASE=ci4_mainDB1_PORT=3306DB1_CHARSET=utf8mb4DB2_HOST=192.168.10.50DB2_USERNAME=report_userDB2_PASSWORD=secret123DB2_DATABASE=ci4_reports
2. 在 app/Config/Database.php 中声明多个数据库组
利用 env() 函数读取 .env 中的变量,构造多个连接配置数组。注意:每个组必须有唯一键名(如 'default'、'reports'),且需显式设置 'DBDriver' 等必需项。
示例节选:
public $default = [
'DSN' => '',
'hostname' => env('DB1_HOST', 'localhost'),
'username' => env('DB1_USERNAME', ''),
'password' => env('DB1_PASSWORD', ''),
'database' => env('DB1_DATABASE', ''),
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => env('DB1_CHARSET', 'utf8mb4'),
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => env('DB1_PORT', 3306),
];
public $reports = [
'DSN' => '',
'hostname' => env('DB2_HOST', 'localhost'),
'username' => env('DB2_USERNAME', ''),
'password' => env('DB2_PASSWORD', ''),
'database' => env('DB2_DATABASE', ''),
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => env('DB2_CHARSET', 'utf8mb4'),
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => env('DB2_PORT', 3306),
];
3. 使用时指定数据库组
在模型或控制器中,通过 $db =& DB('reports') 或 $builder = $db->table('logs') 显式调用非默认库;也可在模型类中覆写 $DBGroup 属性:
-
protected $DBGroup = 'reports';(适用于继承CodeIgniter\Model的模型) -
$this->db = \Config\Database::connect('reports');(手动获取连接)
4. 注意事项
确保所有 .env 变量名拼写一致(大小写敏感),且未被注释;生产环境部署前务必检查 .env 文件权限(不可被 Web 直接访问);多库场景下,事务跨库不生效,需自行协调一致性。











