CodeIgniter 4 不支持 .env 中直接定义多维数据库配置,需用前缀命名(如 DATABASE_DEFAULT_HOST)并在 Database.php 中手动构建多个连接配置(default/read/external),再通过 Config\Database::connect('group') 调用。

CodeIgniter 4 不支持直接在 .env 文件中定义多个数据库连接组(如 database_two.hostname 这类嵌套键),因为 .env 是扁平键值结构,无法原生表达多维数组。但你可以用约定命名 + 手动解析的方式,在运行时从 .env 提取多套数据库参数,再动态构建连接配置。
下面分三类常见需求说明怎么做:
.env 中如何组织多个数据库的配置项
用清晰前缀区分各库,例如:
# 主数据库(default) DATABASE_DEFAULT_HOST = localhost DATABASE_DEFAULT_USERNAME = root DATABASE_DEFAULT_PASSWORD = DATABASE_DEFAULT_DATABASE = app_main DATABASE_DEFAULT_PORT = 3306 # 备库或读库(read_slave) DATABASE_READ_HOST = 192.168.1.100 DATABASE_READ_USERNAME = reader DATABASE_READ_PASSWORD = r34d_p4ss DATABASE_READ_DATABASE = app_main DATABASE_READ_PORT = 3306 # 第三方数据源(external_api_db) DATABASE_EXTERNAL_HOST = api-db.example.com DATABASE_EXTERNAL_USERNAME = apiuser DATABASE_EXTERNAL_PASSWORD = "s3cr3t!" DATABASE_EXTERNAL_DATABASE = sync_data DATABASE_EXTERNAL_PORT = 5432 DATABASE_EXTERNAL_DBDRIVER = postgre
⚠️ 注意:CI4 的
.env不会自动把它们转成$db['read']数组,这一步需手动完成。
在 Config/Database.php 中动态加载多库配置
打开 app/Config/Database.php,修改 public $default 属性的初始化逻辑,改为从环境变量读取并组装:
<?php
namespace Config;
use CodeIgniter\Database\ConnectionInterface;
use CodeIgniter\Database\MySQLi\Connection as MySQLiConnection;
use CodeIgniter\Database\Postgre\Connection as PostgreConnection;
class Database extends \CodeIgniter\Database\Config
{
public function __construct()
{
parent::__construct();
// 构建 default 连接(从 .env 读取)
$this->default = [
'DSN' => '',
'hostname' => env('DATABASE_DEFAULT_HOST', 'localhost'),
'username' => env('DATABASE_DEFAULT_USERNAME', ''),
'password' => env('DATABASE_DEFAULT_PASSWORD', ''),
'database' => env('DATABASE_DEFAULT_DATABASE', ''),
'DBDriver' => env('DATABASE_DEFAULT_DBDRIVER', 'MySQLi'),
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => (int) env('DATABASE_DEFAULT_PORT', 3306),
];
// 手动添加 read 连接(不参与自动加载,需显式调用)
$this->read = [
'DSN' => '',
'hostname' => env('DATABASE_READ_HOST', 'localhost'),
'username' => env('DATABASE_READ_USERNAME', ''),
'password' => env('DATABASE_READ_PASSWORD', ''),
'database' => env('DATABASE_READ_DATABASE', ''),
'DBDriver' => env('DATABASE_READ_DBDRIVER', 'MySQLi'),
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => (int) env('DATABASE_READ_PORT', 3306),
];
// 添加 external 连接(比如 PostgreSQL)
$this->external = [
'DSN' => '',
'hostname' => env('DATABASE_EXTERNAL_HOST', 'localhost'),
'username' => env('DATABASE_EXTERNAL_USERNAME', ''),
'password' => env('DATABASE_EXTERNAL_PASSWORD', ''),
'database' => env('DATABASE_EXTERNAL_DATABASE', ''),
'DBDriver' => env('DATABASE_EXTERNAL_DBDRIVER', 'Postgre'),
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => (int) env('DATABASE_EXTERNAL_PORT', 5432),
];
}
}在控制器或服务中使用指定数据库连接
CI4 不再用 $this->load->database('read') 这种写法,而是通过 Database 服务工厂传参:
// 在控制器方法中
public function index()
{
// 使用默认库(自动注入)
$db = \Config\Database::connect();
// 使用 read 库(需显式指定配置名)
$readDb = \Config\Database::connect('read');
// 使用 external 库(PostgreSQL)
$extDb = \Config\Database::connect('external');
// 查询示例
$users = $db->table('users')->get()->getResult();
$slaves = $readDb->table('replica_status')->get()->getRow();
}也可以在模型中指定连接:
<?php
namespace App\Models;
use CodeIgniter\Model;
class ExternalSyncModel extends Model
{
protected $DBGroup = 'external'; // 关键:指向 Database.php 中定义的配置名
}不复杂但容易忽略:.env 只是字符串容器,CI4 的多库能力靠的是你在 Database.php 里主动定义多个配置块,并用字符串键名(如 'read'、'external')对应调用。只要键名一致,就能切换成功。


















