codeigniter模型可通过构造函数加载指定数据库组实现多库连接,如$this->db = $this->load->database('report_db', true);也可按需临时加载,或根据运行时参数动态选择,需确保配置存在且传参正确。

在 CodeIgniter 中,模型默认使用 $active_group = 'default' 对应的数据库配置。但你完全可以在模型里指定使用其他已定义的数据库连接组,无需修改全局配置或重写核心类。
在模型构造函数中传入连接组名
最常用、最清晰的方式是在模型的 __construct() 中显式加载指定数据库组:
- 确保该数据库组已在
application/config/database.php中正确定义(例如$db['backup']或$db['slave']) - 在模型中调用
$this->load->database('backup', TRUE),第二个参数TRUE表示返回 DB 实例而非继续链式调用 - 将返回的实例赋给
$this->db,覆盖默认连接
示例:
class Report_model extends CI_Model
{
public function __construct()
{
parent::__construct();
$this->db = $this->load->database('report_db', TRUE); // 使用 report_db 组
}
public function get_summary()
{
return $this->db->select('COUNT(*) as total')->from('orders')->get()->row();
}
}
使用不同连接组执行临时查询
如果只是某几个方法需要切换数据库,不必在整个模型生命周期内替换 $this->db。可按需加载并直接使用返回的对象:
- 调用
$other_db = $this->load->database('log_db', TRUE) - 后续用
$other_db->query()、$other_db->get()等操作 - 注意:它不会影响控制器或其他模型中的
$this->db
适合日志写入、审计查询等场景,避免长期占用额外连接资源。
通过配置动态选择连接组
若连接组名来自运行时参数(如多租户环境),可在构造函数中判断后加载:
- 从配置项、Session、URI 或输入参数获取目标组名
- 检查该组是否真实存在(避免
undefined index错误) - 只在有效时加载,否则回退到 default 或抛出异常
例如:
$group = $this->config->item('tenant_db_group') ?: 'default';
if (isset($this->db[$group])) {
$this->db = $this->load->database($group, TRUE);
} else {
show_error("Database group '$group' is not configured.");
}
注意事项
务必确认以下几点,否则会静默失败或报错:
-
database.php中对应组的键名必须与传入的字符串完全一致(区分大小写) - 不要遗漏
TRUE参数——不加时$this->load->database('xxx')返回的是加载器对象,不是 DB 实例 - 多个数据库同时使用时,各连接的前缀(
dbprefix)、字符集等仍以各自配置为准 - 事务不能跨连接组生效,
$this->db->trans_start()只作用于当前绑定的 DB 实例











