codeigniter 查询构建器不自动绑定数据库组,需显式获取对应连接对象:ci3用db('group'),ci4用database::connect('group'),各自调用其qb方法,不可全局切换$this->db。

CodeIgniter 的 Query Builder(查询构建器)本身不自动绑定到某个数据库组,它只是方法集合,真正起作用的是背后那个 $db 实例。所以“指定用哪个库”,本质是**先拿到对应数据库组的连接对象,再用它的 Query Builder 方法**。
CI3 中正确指定数据库组并使用 QueryBuilder
CI3 不支持全局切换默认库,DB('group_name') 返回的是一个独立 DB 对象,必须显式赋值并调用其方法:
-
不能写:
$this->db->select(...)->from(...)->get()—— 这永远走$active_group或默认加载的库 -
必须写:
$read_db = DB('read'); $read_db->select('*')->from('logs')->get()->result(); - 如果要复用,可缓存在类属性里(如
$this->_read_db = DB('read');),避免重复创建对象 - 注意:每个
DB('xxx')调用都新建一个连接实例,事务、连接状态互不影响
CI4 中通过 Config\Database::connect() 获取带 QueryBuilder 的实例
CI4 不再有 $this->load->database() 那套机制,统一用静态连接工厂:
- 获取连接:
$db = \Config\Database::connect('write');(返回ConnectionInterface实例) - 该实例自带完整 Query Builder:
$db->table('users')->where('status', 'active')->get()->getResult(); - 若需多次使用,建议注入为服务或缓存在类中,不要在循环内反复调用
connect() - 不推荐手动 new Connection —— 配置、前缀、字符集等均由 Config 自动注入
配置文件里确保多库定义完整且无歧义
无论 CI3 还是 CI4,多库能被识别的前提是 database.php(CI3)或 app/Config/Database.php(CI4)中各组键名唯一、字段齐全:
- CI3 示例关键点:
$db['read']和$db['write']必须是顶层键,且包含'hostname'、'username'、'database'等必需项 - CI4 示例关键点:每个
return (new Connection())->...->setDatabase('log_db');分支必须明确指定库名和连接参数 - 漏配
'pconnect' => FALSE可能在多库共用主机时引发事务错乱(比如 commit 发到读库)
别指望“全局切换”QueryBuilder目标库
没有安全、可靠、框架原生支持的方式让 $this->db->xxx() 突然改查另一个库。所谓“切换”,只是换一个变量去调用相同方法:
- CI3:
$this->db始终是控制器初始化时加载的那个;想查第二库,就得用新变量,如$second = DB('archive'); - CI4:
$this->db默认不存在,所有 DB 操作都基于你主动获取的连接对象 - 强行覆盖
$this->db(如$this->db = DB('temp');)会破坏生命周期管理,尤其在模型继承场景下极易出错











