必须在config/database.php的connections数组中显式定义两个独立连接,键名唯一、全小写、仅含字母和下划线;Db::connect()参数必须为该键名,传数据库名、模型名或点号命名(如mysql.read)会报Connection not found。

必须在 config/database.php 的 connections 数组里显式定义两个独立连接,键名唯一、小写、仅含字母和下划线;Db::connect() 只能传这些键名,传数据库名、模型名或点号命名(如 mysql.read)会直接报 Connection not found。
database.php 中怎么加第二个 MySQL 连接
不能只复制 default 配置改个 database 就完事——ThinkPHP 不识别“数据库名”,只认你给连接起的键名。每个连接都是一套完整配置,漏字段或错类型会崩。
-
connections数组下新增一个键,比如mysql_backup,键名必须全小写、无点号、无大写 - 每个连接必须显式写全
'type' => 'mysql',否则框架可能用 MySQL 驱动去解析 PostgreSQL 配置,报Class 'PDO' not found -
hostname、database、username、password、charset全部要独立配,不能复用主库值(尤其hostname和database) - 如果两个库字符集不同(如主库
utf8mb4、备份库gbk),必须各自写明'charset' => 'utf8mb4',否则中文插入会截断或乱码 - 改完记得执行
php think clear:config,不然缓存不更新,新配置不生效
Db::connect() 传什么参数才有效
Db::connect() 的参数不是数据库名,也不是模型名,而是 config/database.php 里 connections 下定义的连接键名。它返回一个独立 Query 实例,不影响全局默认连接。
- 正确:
Db::connect('mysql_backup')→ 加载mysql_backup连接配置 - 错误:
Db::connect('backup_db')(键名拼写不一致)、Db::connect('User')(传了模型名)、Db::connect('backup')(键名不存在)→ 全部抛Connection not found: xxx - 禁止高并发下传数组配置,如
Db::connect(['type'=>'mysql', ...]),它不走连接池,每次调用都新建 PDO 实例,MySQL 连接数会迅速打满
模型类里怎么绑定指定数据库连接
模型通过 $connection 属性绑定连接,但这个值只在模型类首次加载时读取一次,运行中不会响应配置变更。
立即学习“PHP免费学习笔记(深入)”;
- 在模型里写
protected $connection = 'mysql_backup';,后续所有UserModel::select()都走该连接 - 关联查询(
with())不会自动跨连接路由:若UserModel绑了mysql_backup,而关联的ProfileModel没设$connection,则Profile仍走默认连接,不会“智能”切到备份库 - 不要指望
$connection能动态切换;真要运行时换库,必须显式调用Db::connect('xxx')->table(...)
最易被忽略的是:键名拼写一致性、type 字段强制声明、以及 charset 必须按库单独指定——这三个点出错,不报语法错误,但查不到数据、插不进中文、连不上库,问题藏得深,排查费时间。



















