动态env文件(多个数据库)和工匠命令

时间:2016-01-15 16:18:25

标签: laravel laravel-5.2

我有一个大项目,每个客户都有自己独立的数据库。为了实现这一点,我们使用自定义.env - 加载程序,通过检查客户子域(每个客户都是唯一的)来加载每个客户.env

然而,当然这不适用于工匠命令。例如,当我想迁移时,我需要一次迁移所有数据库。所以我设置了一个Artisan命令来获取.env - 文件并循环遍历它们,然后调用默认的artisan migrate。但它没有按预期工作。

我已经尝试过一切;例如:

$dotenv = new Dotenv('/env', '.test.env');
$dotenv->overload();

app()->useEnvironmentPath('/env');
app()->loadEnvironmentFrom('.test.env');

甚至:

config('database.connections.mysql.database', 'test_database');

只要我运行$this->call('migrate');,应用默认为默认.env,并在运行时忽略所有自定义。有没有人知道如何重载数据库的迁移命令选择?

注意:我知道我可以在config/database.php中手动设置多个连接(例如:Overriding Default Laravel database configuration for artisan migrate commands),然而,想象一下几十个客户,这不会是可行的。

2 个答案:

答案 0 :(得分:2)

我必须使用由控制台命令创建的SQLite数据库做类似的事情,我可以通过动态创建数据库配置来实现迁移的唯一方法:

Config::set('database.connections.'.$config_key, array(
            'driver'   => 'sqlite',
            'database' => storage_path($database_name),
            'prefix'   => '',
));

然后我会调用migrate命令:

  Artisan::call('migrate', [
        '--database' => $config_key,
        '--path' => 'database/offline/'.$type.'/migrations',
    ]);

答案 1 :(得分:0)

在经历了很多问题后,我能够这样排序;

在Laravel 5中,Config::set()config('config',['key' => 'value])config()-set('config', ['key' => 'value'])似乎有所不同。

经过大量测试后,我们设法以这种方式获得解决方案;

$connection = 'connection';
$iterator = 0;

foreach ($files as $file) {
    App::useEnvironmentPath('/env');
    App::loadEnvironmentFrom('.file.env');

    // Create a new connection "on the fly"
    config()->set('database.connections.' . $connection . '_' . $iterator, [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST'),
        'database'  => env('DB_DATABASE'),
        'username'  => env('DB_USERNAME'),
        'password'  => env('DB_PASSWORD'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ]);

    // Call regular migration command
    $this->call('migrate', ['--force' => true, '--database' => $connection . '_' . $iterator]);

    $iterator++;
}

这设法为MySQL数据库设置多个新连接,然后为每个连接播种。

感谢 @David Allen 在这里获取灵感。