laravel多数据库连接需显式配置、绑定环境变量并指定使用,不配置不生效;每个新连接须完整定义于config/database.php的connections数组中,不可继承默认配置,且必须通过env()读取敏感字段,避免前缀冲突,修改后需运行php artisan config:clear。

多数据库连接在 Laravel 中不是开箱即用的功能,必须显式注册连接、绑定环境变量、并在代码中明确指定使用哪一个——不配置就不会生效,不调用就不会路由过去。
config/database.php 中新增命名连接必须完整定义所有字段
每个新连接(如 mysql_analytics)都得作为独立键写进 'connections' 数组里,不能只改 host 或 database 就完事。Laravel 不会从默认 mysql 连接“继承”其余参数。
- 必须显式声明
driver(mysql/pgsql等),且对应 PHP 扩展已启用(比如用pgsql就得确认pdo_pgsql已安装) - 所有敏感字段(
host、database、username、password)必须通过env()读取,例如'host' => env('DB_ANALYTICS_HOST', '127.0.0.1') - 别动默认的
mysql连接配置——迁移、通知、队列等内部组件依赖它,覆盖后可能导致php artisan migrate失败或邮件发送异常 - 常见错误:漏写
charset和collation,尤其在 MySQL 8+ 环境下容易触发SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
.env 文件里环境变量前缀要语义化且不冲突
不同数据库的环境变量必须用统一前缀隔离(比如 DB_ANALYTICS_),否则 Laravel 会把 DB_HOST 错配到所有连接上,导致多个库连到同一个地址。
- 至少提供
DB_ANALYTICS_HOST、DB_ANALYTICS_PORT、DB_ANALYTICS_DATABASE、DB_ANALYTICS_USERNAME、DB_ANALYTICS_PASSWORD - 如果驱动不是
mysql,必须加DB_ANALYTICS_DRIVER=pgsql,并在config/database.php中保持一致 - 改完
.env后务必运行php artisan config:clear,缓存不清理,新变量永远不生效 - 容易踩的坑:在本地测试时用了
DB_HOST=127.0.0.1,但新连接也沿用这个变量名,结果两个库全指向本地——应严格区分前缀
模型中用 $connection 绑定是长期固定使用的最简方式
适合日志表、报表表、租户专属表这类业务上“只属于某个库”的模型,一设就生效,后续所有 Eloquent 操作自动走该连接。
- 在模型类顶部写
protected $connection = 'mysql_analytics';,值必须和config/database.php里connections的键名**完全一致**(大小写、下划线都不能错) - 记得同步设置
protected $table = 'analytics_events';,否则可能查错表名 - 验证方法:在 Tinker 中执行
App\Models\AnalyticsEvent::first(),看 SQL 日志是否发往预期库;若仍走mysql,先检查拼写,再确认是否清过配置缓存 - 注意:事务不会跨连接,
DB::transaction()只包裹当前连接的操作,另一个连接上的写入不受保护
DB 门面动态切换要注意版本与作用域
适用于临时查一个表、做一次同步、或在 Service 层按条件路由的场景,但写法和行为在不同 Laravel 版本间有差异。
- Laravel 9.x+ 支持链式
DB::table('logs')->connection('mysql_logs')->get();8.x 不支持,只能用DB::connection('mysql_logs')->table('logs')->get() - 不要在事务块里混用多个
DB::connection(),比如DB::connection('a')->transaction(function () { DB::connection('b')->insert(...); })——后者完全游离于事务之外 - 硬编码连接名(如直接写
'mysql_tenant_a')极易出错,建议抽成常量或服务容器绑定,例如在AppServiceProvider::boot()中用$this->app->bind('db.tenant.a', fn() => DB::connection('mysql_tenant_a')) - 迁移和 Seeder 必须显式传
--database=mysql_analytics,否则默认走mysql连接,表建错库是高频事故
最易被忽略的是迁移和 Seeder 的 --database 参数,以及事务不跨连接这个底层限制——它们不会报错,但数据一致性会悄悄崩掉。











