在 config/database.php 的 connections 数组中复制 mysql 配置并重命名为 mysql_analytics,同步在 .env 中添加 dbanalytics* 环境变量,确保连接名全小写、无特殊符号,并在模型中通过 $connection = 'mysql_analytics' 或 db::connection('mysql_analytics') 显式调用;迁移需加 --database=mysql_analytics 参数;跨库事务不被原生支持,需手动控制或改用最终一致性方案。

config/database.php 里怎么加第二个 MySQL 连接
直接在 connections 数组里复制一份 mysql 配置,改个名字就行,比如叫 mysql_analytics。关键不是“加”,而是别漏掉环境变量映射和连接名一致性。
- 必须同步更新
.env:新增DB_ANALYTICS_HOST、DB_ANALYTICS_DATABASE等,否则运行时会 fallback 到默认值或报错Undefined index: host - 连接名(如
mysql_analytics)要全小写、无下划线以外的符号,Laravel 内部用它做键名,拼错就查不到配置 - 别直接改
mysql原配置——多个环境共用时,容易误覆盖主库设置
DB::connection('xxx') 调用时报 Class 'xxx' not found
这不是数据库问题,是 Laravel 把你传的字符串当成了类名去自动加载。说明你用了错误的调用方式,比如 DB::connection('mysql_analytics')->table(...) 没问题,但 new xxx() 或 resolve('xxx') 就会崩。
- 只对
DB::connection()、Schema::connection()、模型$connection属性生效;其他地方传字符串名基本没用 - 如果在模型里指定
protected $connection = 'mysql_analytics';,记得这个字符串必须和config/database.php里定义的 key 完全一致 - 执行
php artisan config:clear后再试,缓存没清会导致新连接名读不到
事务跨连接不生效,A 库提交了 B 库回滚了
Laravel 的 DB::transaction() 只作用于当前连接,默认就是 default 那个。跨库事务本质上不被支持——MySQL 本身不支持分布式事务(除非用 XA,但 Laravel 不封装这层)。
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
- 不要写
DB::transaction(function () { DB::connection('a')->...; DB::connection('b')->...; });,第二个连接的操作不会受事务控制 - 真要强一致性,得自己手动用
beginTransaction()/commit()/rollback()分别控制两个连接,并做好异常捕获和状态追踪 - 多数场景其实该拆成最终一致性:先写主库,发队列异步写分析库,失败重试 + 补偿
模型切换连接后,迁移命令不认新库
php artisan migrate 默认只跑 default 连接的迁移。就算你在模型里写了 $connection = 'mysql_analytics',迁移文件也不会自动绑定到那个库。
- 迁移命令必须显式指定连接:
php artisan migrate --database=mysql_analytics - 对应迁移文件里的
Schema::create()不需要改,Laravel 会根据 --database 参数自动路由 - 注意
php artisan migrate:status也得带--database,否则只显示 default 库的状态,容易误判
多连接最麻烦的不是配,是后续所有依赖连接上下文的地方——查询构造器、模型、迁移、队列任务、甚至第三方包里的 DB:: 调用,都得逐个确认是否指定了正确连接。漏一个,数据就写错库。










