codeigniter 4 模型需在构造函数中显式调用 database::connect('second_db') 并赋值给 $this->db 才能使用非默认数据库;须确保 database.php 已配置 second_db 分组,且不可依赖全局 db 函数。

CodeIgniter 4 的模型默认只连接 default 数据库组,若要在某个模型中固定使用第二个数据库(比如 second_db),不能靠配置文件自动切换,必须在模型内部显式指定连接对象。
在模型构造函数中注入非默认数据库连接
CI4 模型不自动绑定数据库,需手动设置 $this->db 属性。推荐在构造方法中用 \Config\Database::connect() 获取指定分组的连接,并赋值给模型的 db 属性:
- 确保
app/Config/Database.php中已正确定义了$db['second_db']分组(含hostname、username、database等完整字段) - 在模型类中重写
__construct(),调用\Config\Database::connect('second_db') - 将返回的连接实例赋给
$this->db,否则后续所有$this->select()、$this->update()等操作仍走默认库
示例代码:
namespace App\Models;
use CodeIgniter\Model;
use Config\Database;
class LogModel extends Model
{
protected $table = 'logs';
public function __construct()
{
parent::__construct();
$this->db = Database::connect('second_db');
}
}
用服务方式复用连接(适合多模型共用)
如果多个模型都要用 second_db,可将其封装为自定义服务,在 app/Config/Services.php 中添加静态方法:
- 返回
Database::connect('second_db')实例 - 启用单例模式(
shared: true),避免重复创建连接对象 - 模型中通过
Services::secondDb()获取连接,再赋值给$this->db
这样既统一管理,又利于测试和替换。
注意:不要依赖 $db 变量或全局替换
CI4 没有类似 CI3 的 DB('group') 全局工厂函数;\Config\Database::connect() 返回的是独立的 ConnectionInterface 实例,不会影响其他模型或控制器的 $this->db。每个模型的数据库连接是隔离的,改一个不影响另一个。
验证是否生效的小技巧
在模型方法里临时加一行:
var_dump($this->db->getPlatform()->getName()); // 应输出 second_db 对应的数据库类型,如 'MySQL'
如果输出的是 default 库的信息,说明 $this->db 没被正确覆盖,检查构造函数是否执行、是否拼错分组名、或是否漏掉 parent::__construct()。











