我有一个大项目,每个客户都有自己独立的数据库。为了实现这一点,我们使用自定义.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),然而,想象一下几十个客户,这不会是可行的。
答案 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 在这里获取灵感。