Laravel 5 - 更改连接数据库导致迁移错误(租户数据库)

时间:2016-01-04 15:17:32

标签: php laravel-5.1

当我播种多个数据库时,我遇到了问题。第一个数据库种子工作正常。然而,播种第二个数据库失败。

对于第一个数据库,我使用适当的设置创建名为“tenant”的连接。像这样...

    $connections = Config::get('database.connections');
    $tenant_connection = [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => $this->database,
        'username'  => env('DB_USERNAME'),
        'password'  => env('DB_PASSWORD'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
        'port' => '3306'
    ];
    $connections['tenant'] = $tenant_connection;
    Config::set('database.connections', $connections);
    var_dump(Config::get('database.connections')); //its in there!!

对于第二个数据库,我保持连接名称相同,并在连接中更改数据库名称...真的很简单。

Laravel正在保存此连接。但是,它仍然使用原始数据库。假设我使用名为database_1的数据库创建名为'tenant'的连接,种子工作正常。然后我修改'tenant'与database_2的连接。种子在database_1上运行。

我读到Laravel不会重新配置现有的数据库连接。因此添加

DB::reconnect('tenant');

似乎让我使用数据库,但迁移现在失败了,抱怨迁移表不存在,由于某种原因它没有。

以下是要迁移的命令,该命令经过测试且(通常)正常工作:

Artisan::call('migrate', [
        '--path'     => "database/migrations_tenant",
        '--database' => $this->dbc, //which is 'tenant'
    ]);

这就是我无法使用相同的连接名修改数据库。

如果我为每个数据库创建一个新的连接名称,我可以成功运行迁移。不幸的是,在使用可变数据库连接名称时使用eloquent模型时,找到数据库名称有很多复杂情况。我确实有这个工作修改默认连接并保持eloquent连接变量未初始化,这不是一个很好的解决方案。了解如何保持连接名称相同是首选。

1 个答案:

答案 0 :(得分:0)

现在回答我自己的问题,我有事情......

我使用变量名创建租户连接。 然后我使用config将其设置为默认连接。

public static function setDefaultDBC($system)
{
    Config::set('database.default', $system->dbc());
}

连接名称类似于'tenant_1',其中1是在主db中找到的系统ID。我还可以在主数据库中指定一个特定的连接。

如果我需要切换系统,我每次都需要重新设置默认值。

不是我的首选,但除此之外,我必须为成千上万的电话指定连接。

主连接有一个名为'main'的连接