laravel多数据库连接需手动配置:在config/database.php注册唯一连接名并用env()加载敏感配置,.env中用语义化前缀命名变量,模型通过$connection属性或on()方法指定连接,db::connection()支持动态切换但事务不跨连接,迁移和seeder必须显式指定--database参数。

多数据库连接在 Laravel 中不是开箱即用的功能,必须显式注册连接、绑定环境变量、并在代码中明确指定使用哪一个——Laravel 不会自动路由或推断“该查哪个库”。
config/database.php 里怎么加新连接
所有连接都必须注册在 config/database.php 的 'connections' 数组里,每个键名要唯一,且不能覆盖默认的 mysql(它被迁移、通知等内部组件依赖)。
- 新增连接如
'mysql_analytics',必须完整声明driver、host、database、username、password等字段,不能靠“继承默认值”省略 - 所有敏感字段必须用
env()包裹,例如'host' => env('DB_ANALYTICS_HOST', '127.0.0.1'),硬编码会导致部署失败 - 若用 PostgreSQL,需确认 PHP 已启用
pdo_pgsql扩展,且'driver' => 'pgsql'与DB_ANALYTICS_DRIVER=pgsql保持一致 - 别漏掉
charset和collation,MySQL 8+ 默认 utf8mb4,不配可能导致中文乱码或建表失败
.env 文件里环境变量怎么命名才安全
环境变量前缀必须语义化、隔离性强,避免和默认 DB_* 冲突,否则会被意外覆盖。
- 推荐用统一业务前缀,比如
DB_ANALYTICS_HOST、DB_ANALYTICS_DATABASE,而不是DB_HOST_2这类模糊命名 - 至少定义
HOST、PORT、DATABASE、USERNAME、PASSWORD五项;DRIVER和UNIX_SOCKET按需补充 - 改完
.env后必须运行php artisan config:clear,否则缓存中的旧配置仍生效 - 本地开发可加
DB_ANALYTICS_HOST=127.0.0.1,但生产环境严禁写死 IP,应由运维注入
模型里用 $connection 还是 on() 方法
$connection 是静态绑定,适合长期固定归属某库的模型(如日志、报表);on() 是临时切换,适合同一模型偶尔跨库查数据的场景。
- 在模型类顶部写
protected $connection = 'mysql_analytics';,该值必须和config/database.php中的键名**完全一致**,拼错就查默认库 - 不要试图运行时修改
$connection属性来“切换”,它是类属性,只影响当前实例,且后续链式调用可能覆盖它 - 如果只是某次查询要用另一个库,直接写
AnalyticsEvent::on('mysql_legacy')->first(),比改模型更轻量、更安全 -
on()在 Eloquent 查询中有效,但在原生 DB 查询中不支持,得用DB::connection('name')
DB::connection() 动态切换要注意什么
这是最灵活的方式,但也最容易踩坑:它返回的是一个独立连接实例,不是全局切换,事务也不跨连接。
- 写法是
DB::connection('mysql_analytics')->table('events')->get(),注意括号里是字符串,不是变量 - 事务只对当前连接生效:
DB::connection('a')->transaction()里调DB::connection('b')的操作,不在事务保护内 - 迁移和 Seeder 必须显式指定
--database=mysql_analytics,否则默认走mysql连接 - 连接名散落在各处易出错,建议抽成常量或服务容器绑定,比如在
AppServiceProvider::boot()中 bind'db.analytics'到DB::connection('mysql_analytics')
最常被忽略的是事务边界和迁移命令的 --database 参数——这两个地方一旦漏掉,线上可能读到脏数据或跑错库,但错误不会立刻报出来。











