使用Laravel Artisan迁移多个数据库


Migrating multiple databases with Laravel Artisan

我的命令migrate:s包含以下

public function handle()
{
    $sites = Sites::all();

    foreach($sites as $site)
    {
        $host       = $site->h;
        $database   = $site->d;
        $username   = $site->u;
        $password   = $site->p;
        $this->info('Trying to migrate ' . $database);
        Config::set('database.connections.mysql.host',      $host);
        Config::set('database.connections.mysql.database',  $database);
        Config::set('database.connections.mysql.username',  $username);
        Config::set('database.connections.mysql.password',  $password);
        //Reconnect with new credentials
        DB::reconnect('mysql');
        //Call the migration on the new connection
        $this->call('migrate');
        $this->info('Migrations complete for database ' . $site->d);
    }
}

第一个站点总是可以很好地迁移,但是在它不断尝试创建迁移表之后,尽管已经有一个迁移表,一个已经填充的迁移表。

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'migrations' already exists

数据库的凭据是正确的,我不明白为什么它在第一次迁移后试图制作表。

问题是设置被缓存,因此第一个连接可以工作,因此您需要使用清除连接

DB::purge('connectionName');

只是想一想,->调用函数可能以某种方式重新初始化了Laravel的一部分,或者至少这是我的最佳猜测。如果您将每个站点都作为数据库连接(即mysql1、mysql2、mysql3等),那么您可以尝试使用--database选项来运行迁移,看看这是否有帮助?

migrate命令有一个选择数据库连接的选项:

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Console/Migrations/MigrateCommand.php