Laravel迁移默认只走config/database.php中'default'指定的连接,需在迁移类中显式声明public $connection = 'mysql_secondary'属性才能指定其他连接,该设置优先级最高且仅作用于当前迁移的up()和down()方法。

直接说结论:Laravel 迁移默认只走 config/database.php 里 'default' 指定的连接,想指定别的连接(比如 mysql_secondary),必须在迁移文件里显式声明 $connection 属性,不能靠 php artisan migrate --database=xxx 全局切换——这个命令只对命令行执行有效,且不改变模型或迁移内部的连接逻辑。
迁移文件里怎么指定数据库连接
在生成的迁移类中,直接定义 $connection 类属性即可。它会覆盖全局默认连接,且优先级最高:
-
$connection是 Migration 基类已支持的属性,Laravel 5.2+ 均可用 - 值必须是
config/database.php中'connections'下存在的键名,比如'pgsql_archive' - 该设置仅影响当前迁移的
up()和down()方法里的 Schema 操作,不影响 Eloquent 模型
class CreateReportsTable extends Migration
{
public $connection = 'mysql_reporting'; // ← 关键:指定连接名
public function up(Blueprint $table)
{
Schema::create('reports', function (Blueprint $table) {
$table->id();
$table->string('title');
});
}
}
php artisan migrate --database=xxx 到底管不管用
它只在命令执行层面临时替换 DB_DEFAULT_CONNECTION,但有明显局限:
- 只对未在迁移类中硬编码
$connection的文件生效 - 如果迁移里写了
$connection = 'foo',命令行参数会被忽略 - 运行时不会修改
config('database.default'),所以后续代码(如 Seeder 或 Model)仍走原配置 - 多连接混合迁移时容易误操作,比如忘记加
--database导致表建错库
跨连接迁移常见坑与验证方法
最容易出问题的是「以为连对了,其实建到了 default 库」。验证是否生效最直接的方式是:
- 执行前加日志:
Log::info('Running migration on connection: ' . $this->connection); - 在
up()开头手动查一下当前连接:dd(DB::connection()->getPdo()->getAttribute(PDO::ATTR_CONNECTION_STATUS)); - 别依赖
DB::getDefaultConnection(),它返回的是配置项,不是当前迁移实际用的连接 - 如果用到了
Schema::connection('xxx')->create(...),那$connection属性就失效了——二者互斥,选一个用就行
真正麻烦的是迁移依赖关系:比如 A 迁移建在主库,B 迁移建在从库,但 B 里调用了 A 表的模型方法——这时候模型的 $connection 设置、查询构造器的 on() 调用、迁移自身的 $connection 必须全部对齐,漏一个就会连错库。


















