laravel 配多数据库需三步:一在 config/database.php 定义连接(键名小写下划线、env() 读取、charset 统一 utf8mb4);二在 .env 补环境变量并运行 config:clear;三通过模型 $connection 属性或 on() 方法切换库,迁移、事务等需显式指定 --database 或 connection()。

在 Laravel 里配多数据库,核心就三件事:定义连接、绑定模型或临时切换、注意事务和迁移的特殊处理。不改配置文件、不清理缓存、名字写错或字符集不一致,都可能查着查着就跑回主库了。
一、在 config/database.php 里加新连接
打开 config/database.php,找到 'connections' 数组,在里面新增一个键(比如 'mysql_analytics'),结构和默认的 'mysql' 一样,但所有参数必须指向另一个库:
- 键名必须全小写,只含字母、数字和下划线(
mysql2可以,mysql-2会报错) - 每个字段都用
env()读取,比如'host' => env('DB_ANALYTICS_HOST'),别硬编码 -
'charset'和'collation'建议统一设为'utf8mb4'和'utf8mb4_unicode_ci',避免中文乱码或插入失败 - 确认没误删或覆盖默认的
'mysql'连接——Laravel 内部很多功能(如迁移、通知)依赖它
二、在 .env 里补上对应环境变量
光配 PHP 文件不够,得让 Laravel 知道这些值从哪来。在 .env 文件里加上:
DB_ANALYTICS_HOST=192.168.1.200DB_ANALYTICS_DATABASE=analytics_dbDB_ANALYTICS_USERNAME=analystDB_ANALYTICS_PASSWORD=secret123
改完记得运行 php artisan config:clear,否则缓存会让新配置不生效。
三、模型固定用某个库 or 查询时临时切
两种常用方式,适用场景不同:
- 让整个模型永远走副库:在模型类里加
protected $connection = 'mysql_analytics';,字符串必须和config/database.php里的键名**完全一致**(大小写、下划线都不能差) - 某次查询临时切库:用
User::on('mysql_analytics')->get()或DB::connection('mysql_analytics')->table('logs')->get() - 别在控制器里混着用:比如先
DB::connection(...)->get(),又写Report::all()——后者仍走默认库,数据对不上还难排查
四、迁移、事务、Observer 这些要单独处理
它们不会自动继承你设的连接,容易踩坑:
- 跑迁移要用
php artisan migrate --database=mysql_analytics,不加--database就只动默认库 - 事务只作用于单个连接:
DB::connection('mysql_analytics')->transaction(...)不会影响mysql库 - Observer、子查询、
DB::raw()都不自动带连接,得手动指定,比如SomeModel::on('mysql_analytics')->with(['related' => function ($q) { $q->on('mysql_analytics'); }])











