2015-11-12 4 views
1

Я работаю над созданием системы с использованием основной базы данных и нескольких баз данных арендаторов в laravel 5. У меня нет миграции базы данных и семена для основной базы данных, используя php artisan migrate:refresh --seed.База данных арендаторов семян в Ларавеле 5

Арендаторы затем получают свою собственную базу данных при регистрации. Мне нужно запустить миграцию и семена в базе данных арендаторов.

Файлы миграции арендатора хранятся в отдельной папке. Трассы миграции (к сожалению, на основной базе данных) с помощью следующей команды

\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 .... Как я могу указать миграцию для запуска в конкретной базе данных?

UPDATE:

Я обнаружил, что изменение 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' 
     ]); 

Так что, похоже, я ответил на свой вопрос, однако, возможно, некоторые могут прокомментировать эту процедуру.

ответ

0

Я положу свое собственное решение вниз .... 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);