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