Laravel中如何连接多个数据库_Laravel配置多数据库连接切换【教程】

10次阅读

laravel数据库需显式指定连接而非自动切换:在config/database.php定义命名连接,在模型设$connection属性,或用DB::connection()临时切换;迁移、通知等内部组件仍依赖默认连接。

Laravel中如何连接多个数据库_Laravel配置多数据库连接切换【教程】

Laravel 默认支持多数据库连接,但“配置好就能自动切换”是常见误解——连接定义只是第一步,真正关键的是在模型、查询构造器或 DB 门面中显式指定连接,否则仍走默认连接。

如何在 config/database.php 中定义多个数据库连接

每个连接需有唯一名称,并明确驱动、主机、库名等。Laravel 不会自动识别“主从”或“读写分离”,必须手动命名并引用。

  • mysql 是默认连接名,不要覆盖它;新增连接建议用语义化名称,如 mysql_analyticspgsql_reporting
  • 不同驱动(如 mysqlpgsql)可共存,但需确保对应扩展已启用(如 pdo_pgsql
  • 环境变量应通过 env() 拉取,避免硬编码'host' => env('DB_ANALYTICS_HOST', '127.0.0.1')
return [     'connections' => [         'mysql' => [             'driver' => 'mysql',             'url' => env('DATABASE_URL'),             'host' => env('DB_HOST', '127.0.0.1'),             // ... 其他默认配置         ],         'mysql_analytics' => [             'driver' => 'mysql',             'host' => env('DB_ANALYTICS_HOST'),             'database' => env('DB_ANALYTICS_DATABASE'),             'username' => env('DB_ANALYTICS_USERNAME'),             'password' => env('DB_ANALYTICS_PASSWORD'),             'charset' => 'utf8mb4',             'collation' => 'utf8mb4_unicode_ci',         ],     ], ];

如何在 Eloquent 模型中绑定特定数据库连接

模型默认使用 config('database.default') 对应的连接。要绑定到其他连接,必须设置 $connection 属性。

  • 该属性值必须与 config/database.phpconnections 下的键名完全一致(如 mysql_analytics
  • 不支持运行时动态改写该属性来“切换”——它是类属性,修改只对当前实例生效,且易被后续查询覆盖
  • 若一个模型需偶尔查另一个库,优先用 on('connection_name'),而非改 $connection
class AnalyticsEvent extends Model {     protected $connection = 'mysql_analytics';     protected $table = 'events'; }

如何在查询构造器或 DB 门面中临时切换连接

这是最灵活的方式,适用于单次查询、事务或按业务逻辑分流场景。注意:DB::connection() 返回的是新连接实例,不是全局切换。

  • 使用 DB::connection('mysql_analytics')->table(...) 可直接查指定库
  • 事务必须在同一个连接实例上调用 beginTransaction()commit(),跨连接事务无效
  • 避免在循环中反复调用 DB::connection()——连接实例可复用,重复获取无必要
// 查 analytics 库的统计 $stats = DB::connection('mysql_analytics')     ->table('daily_summary')     ->where('date', '>=', '2024-01-01')     ->get();  // 跨库关联?不行。Laravel 不支持 JOIN 多连接,得用应用层合并或视图

容易被忽略的关键点

多连接本身不增加复杂度,但以下三点常导致线上问题:

  • 迁移文件默认只作用于 default 连接,执行 php artisan migrate --database=mysql_analytics 才能指定目标
  • 数据库通知(Notifiable)、缓存表、session 表等 Laravel 内部组件,都依赖默认连接,不会自动适配你新增的连接
  • 连接名拼错(比如配置里是 mysql_report,代码里写成 mysql_reports)会静默 fallback 到默认连接,查错时极难发现

text=ZqhQzanResources