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

Laravel 默认支持多数据库连接,但“配置好就能自动切换”是常见误解——连接定义只是第一步,真正关键的是在模型、查询构造器或 DB 门面中显式指定连接,否则仍走默认连接。
如何在 config/database.php 中定义多个数据库连接
每个连接需有唯一名称,并明确驱动、主机、库名等。Laravel 不会自动识别“主从”或“读写分离”,必须手动命名并引用。
-
mysql是默认连接名,不要覆盖它;新增连接建议用语义化名称,如mysql_analytics、pgsql_reporting - 不同驱动(如
mysql和pgsql)可共存,但需确保对应扩展已启用(如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.php中connections下的键名完全一致(如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 到默认连接,查错时极难发现










