Laravel 动态环境文件(多个数据库)和artisan命令

Laravel 动态环境文件(多个数据库)和artisan命令,laravel,laravel-5.2,Laravel,Laravel 5.2,我有一个大型项目,将有他们自己的数据库中的每个客户。为了实现这一点,我们使用一个定制的.env-loader,通过检查customers子域(每个客户特有)来加载每个客户.env 但是,这当然不适用于artisan命令。例如,当我想要迁移时,我需要一次迁移所有数据库。因此,我设置了一个Artisan命令,它获取.env-文件并循环遍历它们,然后调用默认的Artisan migrate。但它并没有像预期的那样发挥作用 我什么都试过了;例如: $dotenv = new Dotenv('/env',

我有一个大型项目,将有他们自己的数据库中的每个客户。为了实现这一点,我们使用一个定制的
.env
-loader,通过检查customers子域(每个客户特有)来加载每个客户
.env

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

我什么都试过了;例如:

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

甚至:

config('database.connections.mysql.database', 'test_database');
只要我运行
$this->call('migrate')
应用程序默认为默认的
.env
,并在运行时忽略所有自定义设置。有人知道我如何重载数据库的迁移命令吗


注意:我知道我可以在
config/database.php
(例如:)中手动设置多个连接,但是,镜像几十个客户,这是不可行的。

我必须对控制台命令创建的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',
    ]);

在经历了一大堆问题之后,我能够这样分类

$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++;
}
在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的启发。

哦,真的吗?嗯,这很有意思——我会查一查再回来。非常感谢!你可能会对我不久前写的东西感兴趣——并且(目前两者都还没有测试)感谢你的评论;虽然这和我想要的相去甚远。谢谢分享!