Я работаю над многопользовательским приложением с несколькими арендаторами, где у меня есть основной DB
который состоит из таблицы арендаторов, а затем для каждого созданного арендатора создается новая DB
. Я пишу файл семени для этого, и я запускаю его 3 раза, чтобы создать 3 Арендатора и последующие 3 DB
для них.
Он работает отлично в первый раз. В основной DB
создается новый арендатор. Новая DB
создается с использованием имени username
нового арендатора. DB
также migrated
с помощью вызова команды Artisan
из кода. Но в следующих двух циклах арендаторы создаются в основной DB
и для них создаются новые DB
но командный вызов 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
, но не переносятся. Из этого успешно успешно переносится только первая DB
. И никакая ошибка не бросается от ремесленника.
Выход командной строки выглядит следующим образом:
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); # ...