三步配置多数据库连接:在config/database.php新增完整连接配置、.env中用语义化前缀定义变量并清缓存、模型设$connection或查询时用DB::connection();需避坑硬编码、缓存未清、跨连接事务。

直接在 config/database.php 里加连接、.env 里配对应变量、模型用 $connection 或查询时调 DB::connection(),三步就能跑通。硬编码连接名、漏清缓存、跨连接事务,是新手踩坑最密集的三个点。
config/database.php 中新增连接必须写全字段
只改 host 或 database 是不够的——Laravel 不会从默认连接“继承”其他字段。每个新连接(比如 mysql_log)都得显式声明所有必需项:
-
driver必须是mysql、pgsql等有效值,且对应 PHP 扩展已启用(如pdo_pgsql) -
host、port、database、username、password全部用env()包裹,禁止硬编码 -
charset和collation建议显式设为utf8mb4/utf8mb4_unicode_ci,MySQL 8+ 缺失会导致SQLSTATE[HY000] [2054] - 别动默认的
mysql连接,php artisan migrate和通知系统依赖它
.env 变量命名必须带语义化前缀
复用 DB_HOST 会导致所有连接指向同一地址。正确做法是用隔离前缀,比如日志库用 DB_LOG_*:
- 在
.env中添加:DB_LOG_HOST=127.0.0.1、DB_LOG_DATABASE=log_db、DB_LOG_USERNAME=root、DB_LOG_PASSWORD= - 如果驱动不是 MySQL,还得加
DB_LOG_DRIVER=pgsql,并在config/database.php中保持一致 - 改完
.env后必须运行php artisan config:clear,否则缓存里的旧配置还在生效
模型绑定 $connection 比手写 DB::connection() 更稳
对长期归属某库的模型(如日志表、报表表),直接在类里设静态属性更可靠:
- 在
app/Models/LogEntry.php顶部写:protected $connection = 'mysql_log'; - 这个字符串必须和
config/database.php中connections的键名**完全一致**(大小写、下划线都不能错) - 别在构造函数里动态改
$this->connection,它是静态属性,运行时改无效 - 临时切换可用
User::on('mysql_tenant_123')->get(),比改模型更轻量,但注意on()是 Eloquent 方法,不适用于 Query Builder 链式调用
DB::connection() 动态切换要注意链式调用和事务边界
DB::connection('xxx') 返回的是独立连接实例,断开链式调用就回退到默认库:
- 正确写法:
DB::connection('mysql_log')->table('logs')->select('*')->get() - 错误写法:
$db = DB::connection('mysql_log'); $db->table('logs')->get();—— 第二行实际走默认连接 - 事务不跨连接:
DB::connection('a')->transaction()里调DB::connection('b')的操作,不在事务保护内 - 迁移和 Seeder 必须显式指定
--database=mysql_log参数,否则默认走mysql
连接名散落在模型、控制器、命令里,后期难维护。真要多租户或高频切换,建议把连接名抽象成常量或服务标识,比如在 AppServiceProvider::boot() 里用 $this->app->bind('db.log', function () { return DB::connection('mysql_log'); });,再通过容器解析。


















