模型类必须硬编码$connection属性,如protected $connection = 'mysql_read',且键名须与config/database.php中connections数组键名完全一致,首次加载后不可动态修改。

模型类要分别连不同数据库,必须在类里硬编码 $connection 属性,不能靠运行时改配置或调用方法临时切换——这是最稳、最常用、也最容易被误以为“可以动态改”的地方。
模型类里怎么写 $connection 才生效
这个属性只在模型类第一次加载时读取一次,之后 reload config 或手动改值都没用。它不是变量,是类的静态绑定点。
- 必须写成
protected $connection = 'mysql_read';,且'mysql_read'要和config/database.php中connections数组的键名**完全一致**(大小写敏感、不能有空格或点号) - 如果配置里写的是
'log_db',但模型里写了'logdb',就会静默 fallback 到default连接,不报错也不提示 - 关联查询(如
User::with('profile'))中,profile模型仍走它自己定义的$connection,不会继承User的连接——这点常被忽略,导致查不到数据却以为是 SQL 写错了 - 事务不跨模型:即使两个模型都连了同一台 MySQL 实例的不同库,
User::startTrans()和Log::startTrans()仍是两套隔离事务,无法一起提交
Db::connect() 和模型 $connection 不是一个东西
很多人以为 Db::connect('log_db') 会“让当前模型切过去”,其实完全无关。前者返回一个独立 Query 实例,后者是模型类的固定属性。
-
Db::connect('log_db')->table('user_action')->select()是纯 Db 查询,不走任何模型逻辑 -
User::where('id', 1)->select()一定走User模型的$connection,哪怕你前面刚调过Db::connect() - 混用会翻车:比如
Db::connect('log_db'); User::select()—— 第一行没赋值给变量,第二行还是查default库 - 想临时查日志库又用模型逻辑?只能新建一个专用模型,比如
LogAction,并在里面写protected $connection = 'log_db';
多个连接配错的典型错误现象
不是报错才叫错,很多是“看起来正常但连错了库”,尤其当多个连接指向同一台 MySQL 实例时。
-
Connection not found: mysql_slave:键名拼错,或没加到connections数组里,或用了大写/点号(如'MysqlSlave'或'mysql.slave') - 中文乱码或字段截断:不同连接的
charset配置不一致,比如主库设了'charset' => 'utf8mb4',从库漏了,默认变成latin1 - 查不到数据但 SQL 没报错:两个连接的
hostname和port一样,但database写重复了,实际连到了同一个库 - 高并发下 MySQL 报 “Too many connections”:误用
Db::connect(['hostname' => ...])传数组,绕过了连接池,每次新建物理连接
真正麻烦的不是配不通,而是配通了却连错库——因为没显式校验连接实际指向哪个 database,建议在上线前用 Db::connect('xxx')->query('SELECT DATABASE()') 实测一次。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











