Laravel连接新数据库需手动配置:在config/database.php中完整定义连接(含driver、host等字段并用env()包裹),.env中使用语义化前缀(如DB_LOG_HOST),运行php artisan config:clear刷新缓存;模型通过protected $connection='mysql_log'绑定,临时切换用::on(),迁移需加--database参数。

直接连不上新库,八成是 config/database.php 里没注册连接名,或者 .env 里的变量名和配置对不上——Laravel 不会自动猜你要连哪个库,所有连接都得手动“报备”。
在 config/database.php 里加连接必须写全字段
新增连接不能只改 host 或 database 就完事。比如加一个叫 mysql_log 的连接,connections 数组里必须显式写出:
-
driver(必须是mysql、pgsql等有效值,且对应 PHP 扩展已启用) -
host、port、database、username、password(全部用env()包裹,别硬编码) -
charset和collation(MySQL 8+ 不配容易触发SQLSTATE[HY000] [2054]认证错误) - 别动默认的
mysql连接——迁移、通知这些内部功能依赖它
环境变量命名必须隔离,不能复用 DB_*
如果两个库都用 DB_HOST=127.0.0.1,那它们全会连到同一个地址。正确做法是用语义化前缀,比如:
-
DB_LOG_HOST、DB_LOG_PORT、DB_LOG_DATABASE、DB_LOG_USERNAME、DB_LOG_PASSWORD - 如果驱动不是 MySQL,还得加
DB_LOG_DRIVER=pgsql,并在config/database.php里保持一致 - 改完
.env后必须跑php artisan config:clear,否则缓存里的旧配置还在生效
模型绑定 $connection 比手写 DB::connection() 更稳
对长期固定归属某库的模型(比如日志表、报表表),直接在模型类顶部写:
protected $connection = 'mysql_log';
注意:
- 这个字符串必须和
config/database.php中connections的键名**完全一致**(大小写、下划线都不能错) - 设完不清理缓存,
$connection就不会生效 - 别在构造函数里动态改
$this->connection,它是静态属性,运行时改无效 - 临时切换用
User::on('mysql_tenant_123')->get(),比改模型更轻量
DB::connection() 必须链式调用,断开就回退默认库
DB::connection('mysql_log') 本身只是返回一个查询构建器实例,不执行任何 SQL。最容易踩的坑是:
- 写了
DB::connection('mysql_log')就停了,后面没跟->table()->get()之类的方法,结果查的还是默认库 - 混用连接做关联:比如
DB::connection('mysql_log')->table('logs')->join('users', ...),这里的users表会去mysql_log对应的库找,不是主库 - 跨库 join 不支持,得用原生 SQL 或数据库视图
- 事务不跨连接,
DB::transaction()只作用于当前连接
最常被忽略的一点:迁移和 Seeder 默认只走 mysql 连接。要操作其他库,必须显式加 --database=mysql_log 参数,或者在代码里用 DB::connection('mysql_log') 包裹。


















