【问题标题】:Dynamic env-files (multiple databases) and artisan commands动态环境文件(多个数据库)和工匠命令
【发布时间】:2016-04-21 07:15:07
【问题描述】:

我有一个大型项目,每个客户都有自己独立的数据库。为了让它工作,我们使用自定义的.env-loader,通过检查客户子域(每个客户唯一)加载每个客户.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),但是,如果要创建几十个客户,这将是不可行的。

【问题讨论】:

标签: laravel laravel-5.2


【解决方案1】:

在解决了很多问题后,我能够以这种方式对其进行排序;

在 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 的启发。

【讨论】:

    【解决方案2】:

    我必须对由控制台命令创建的 SQLite 数据库执行类似的操作,而让迁移运行的唯一方法是动态创建数据库配置:

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

    然后我会调用迁移命令:

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

    【讨论】:

    • 哦,真的吗?嗯,这很有趣——将检查并返回。非常感谢!
    猜你喜欢
    • 2015-06-24
    • 2021-11-22
    • 2014-08-30
    • 2014-12-15
    • 2014-09-07
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多