Я работаю над созданием системы с использованием основной базы данных и нескольких баз данных арендаторов в laravel 5. У меня есть миграция базы данных и семена для основной базы данных без проблем, используя php artisan migrate:refresh --seed
.
Затем арендаторы получают свою собственную базу данных при регистрации. Мне нужно запустить миграцию и семена в базе данных арендаторов.
Файлы миграции арендатора хранятся в отдельной папке. Прогон миграции (к сожалению, в основной базе данных) со следующей командой
\Artisan::call('migrate', [
'--path' => "database/migrations_system"
);
Однако мне нужно, чтобы миграция произошла в базе данных арендатора, скажем, DB_1.
Я прочел следующее:
\Artisan::call('migrate', [
'--path' => "database/migrations_system",
'--database' => 'db_1'
]);
Однако в итоге я получаю ошибку
InvalidArgumentException in DatabaseManager.php line 238:
База данных [db_1] не настроена.
Stuck.... Как я могу указать, чтобы миграция выполнялась в конкретной базе данных?
ОБНОВИТЬ:
Я обнаружил, что изменение config/database.php
и добавление db_1 заставляет меня пройти эту ошибку....
'db_1' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => 'db_1',
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'pass'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'port' => '3306'
],
Однако эта связь неизвестна и должна выполняться "на лету", и я также зациклился на том, как это сделать....
UPDATE Снова и работающее решение.... Модифицируйте конфигурацию на лету...
$connections = \Config::get('database.connections');
$tenant_database = 'db_1'; //assign from your main database
$tenant_connection = [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => $tenant_database ,
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'port' => '3306'
];
$connections['tenant'] = $tenant_connection;
\Config::set('database.connections', $connections);
\Artisan::call('migrate', [
'--path' => "database/migrations_system",
'--database' => 'tenant'
]);
Похоже, я ответил на свой вопрос, однако, возможно, некоторые могут прокомментировать эту процедуру.
Я поставлю свое собственное решение... 1) Создайте имя базы данных Например, я db_1
новую базу данных db_1
где 1 представляет идентификатор системы в основной базе данных. Я рассмотрел сохранение уникального скремблированного имени в основной базе данных. В конце концов это казалось излишним.
2) Создайте соединение - для этого я использую то же имя, что и новая база данных.
public function createConnection()
{
$connections = \Config::get('database.connections');
if(!isset($connections[$this->getSystemName()]))
{
$tenant_connection = [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => $this->getSystemName(),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'port' => '3306'
];
$connections[$this->getSystemName()] = $tenant_connection;
\Config::set('database.connections', $connections);
//dd(\Config::get('database.connections'));
}
}
3) Создайте базу данных, которую вы используете с помощью основного подключения
$sql = "CREATE DATABASE " . $this->tenant_name;
DB::connection('main_db')->statement($sql);
4) выполнить миграцию
$r = \Artisan::call('migrate', [
'--path' => "database/migrations_tenant",
'--database' => $this->tenant_name
]);
5) наконец, вы можете засеять тестовые данные или загрузить некоторые данные по умолчанию. Доступ к соединению
DB::connection($this->system_name)->table($table)->insert($csv);