我正在开发一个多租户多数据库应用程序,其中我有一个主要DB
,其中包含一个租户表,然后为每个创建的租户创建一个新的DB
。我正在为此编写一个种子文件,我正在运行它3次,为他们创建3个租户和随后的3个DB
。
第一次运行正常。在主DB
中创建新租户。使用新租户的DB
创建新的username
。 DB
也是migrated
,代码中有Artisan
命令调用。但是在接下来的2个循环中,租户是在主DB
中创建的,新的DB
也是为它们创建的,但Artisan
命令调用不会迁移{ {1}}' S
DB
我在这里做错了什么。它第一次完美运行。然后最后两次只创建了public function run()
{
$faker = Faker::create();
// Fetching all tenants
$tenants = App\Tenant::all();
// Deleting their databases
$tenants->each(function($tenant){
DB::statement('DROP DATABASE IF EXISTS ' . $tenant->username);
});
// Truncating the tenants table itself
DB::table('tenant')->truncate();
for($i = 0; $i < 3; $i++){
$company = $faker->company();
$description = $faker->text();
$logo = $faker->imageUrl(50, 50);
$username = str_random(8);
\Config::set('database.default', 'archive');
echo 'Creating tenant ' . $i . "\r\n";
Tenant::create([
'name' => $company,
'description' => $description,
'logo' => $logo,
'username' => $username,
]);
DB::statement('CREATE DATABASE ' . $username);
\Config::set('database.connections.tenant.database', $username);
\Config::set('database.default', 'tenant');
echo 'Migrating tenant ' . $i . "\r\n";
\Artisan::call('migrate', [
'--path' => 'database/migrations/tenants'
]);
echo "\r\n";
}
}
但未迁移的DB
。仅从此成功迁移了第一个DB
。工匠没有错误。
命令行输出如下:
Creating tenant 0
Migrating tenant 0
Creating tenant 1
Migrating tenant 1
Creating tenant 2
Migrating tenant 2
答案 0 :(得分:2)
Laravel中的数据库连接保持活动状态,这意味着当您通过config
更改数据库名称时,它不会切换到新数据库。您需要强制DB::connection($connection)->reconnect()
重新连接后台连接。
运行迁移时,由于Laravel使用数据库名称和表名来检查{{1}}表是否存在,因此您还需要更新当前连接的表名。
在你的情况下:
migrations