База данных посевных арендаторов в Ларавел 5

1

Я работаю над созданием системы с использованием основной базы данных и нескольких баз данных арендаторов в 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'
        ]);

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

Теги:
database-migration
laravel-5
artisan

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню