ci4多数据库需手动配置:.env中用db_second_*等扁平命名,在app/config/database.php中显式读取并注册second_db组,通过database::connect('second_db')获取连接,不可依赖自动加载或ci3语法。

只在 .env 里配置多数据库,CI4 不会自动加载——它默认只认 email.default.* 这类固定前缀,而数据库配置没有内置的环境前缀识别机制。多库配置必须显式落到代码层,否则变量只是“存在”,但没人读取。
必须重写 Email.php 或 Database.php 配置类
CI4 的 Services::email() 和数据库连接(如 Database::connect())都依赖对应的 Config 类实例。这些类不会自动扫描 .env 中所有以 db.second_db.* 开头的变量。
- 若用自定义数据库组(如
second_db),需在app/Config/Database.php中手动读取:$config['second_db'] = [ 'DSN' => env('DB_SECOND_DSN', ''), 'hostname' => env('DB_SECOND_HOSTNAME', 'localhost'), ... ]; - 不要写
db.production.hostname这类命名,CI4 不解析;统一用DB_SECOND_HOSTNAME等扁平命名,再在配置类中映射 - 邮件同理:在
app/Config/Email.php构造函数或init()方法里,用env('email.default.SMTPHost')显式赋值给对应属性
确保 .env 变量名与代码引用完全一致
大小写、下划线、拼写差一个字符都会导致 env() 返回 null,且无报错。
- 推荐命名规范:
DB_SECOND_HOST、DB_SECOND_USERNAME、DB_SECOND_PASSWORD - 避免使用点号(
.)或中划线(-),env()只支持字母、数字、下划线 - 检查等号前后无空格:
DB_SECOND_HOST = 127.0.0.1❌ → 应为DB_SECOND_HOST=127.0.0.1✅
验证是否真被加载了
别靠猜测,直接测:
- 在控制器里临时加一行:
log_message('debug', 'DB_SECOND_HOST: ' . env('DB_SECOND_HOST', 'MISSING'));,然后看日志 - 运行
php spark env(需安装spark-env插件)或新建一个路由输出print_r($_ENV),确认变量已注入 PHP 环境 - 如果
env()返回空,说明.env文件未被 CI4 加载——检查文件是否在项目根目录、权限是否可读、是否被 .gitignore 误删
多库切换必须用 connect(),不能依赖 $this->db
CI4 没有全局 $this->db 属性,每个连接都是独立对象。
- 正确方式:
$db2 = \Config\Database::connect('second_db');,然后$db2->table('logs')->get()->getResult(); - 错误方式:
$this->db->connect('second_db')(不存在该方法)或DB('second_db')(这是 CI3 写法,CI4 不兼容) - 若频繁使用,建议封装成服务:在
app/Config/Services.php中添加静态方法返回Database::connect('second_db')











