我正在开发一个 Multi-Tenancy 多数据库应用程序,其中我有一个主DB
,它由一个租户表组成,然后对于创建的每个租户,都有一个新的DB
已创建。我正在为此编写一个种子文件,并运行它 3 次来为它们创建 3 个租户和后续的 3 个DB
。
第一次运行良好。在主数据库中创建了一个新租户。使用新租户的用户名
创建新的DB
。 DB
也通过代码中的 Artisan
命令调用进行迁移
。但在接下来的 2 个循环中,租户在主数据库中创建,并且还为它们创建了新的数据库,但使用了 Artisan 命令调用不会迁移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
从中成功迁移。 artisan 不会抛出任何错误。
命令行输出如下:
Creating tenant 0
Migrating tenant 0
Creating tenant 1
Migrating tenant 1
Creating tenant 2
Migrating tenant 2
最佳答案
数据库连接在 Laravel 中保持事件状态,这意味着当您通过 config
更改数据库名称时,它不会切换到新数据库。您需要通过DB::connection($connection)->reconnect()
强制后台连接重新连接。
运行迁移时,由于 Laravel 使用数据库名称和表名称来检查 migrations
表是否存在,因此您还需要更新当前连接的表名称。
就您而言:
# ...
\Config::set('database.connections.tenant.database', $username);
\Config::set('database.default', 'tenant');
\DB::reconnect();
\DB::setDatabaseName($username);
# ...
关于php - Seeder 第一次运行良好,但在 Laravel 5 的后续循环中不执行某些任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32989103/