Использование подключения к базе данных Dynami c в миграции Laravel - PullRequest
0 голосов
/ 21 января 2020

Мое приложение имеет несколько клиентов, каждый из которых имеет собственную базу данных. Приложение для клиентов основано на плагинах, поэтому таблицы для каждого клиента имеют одинаковую структуру. Но клиент A не обязательно имеет те же таблицы, что и клиент B (потому что клиент B использует больше / других плагинов).

Я создал "клиентское" соединение в моем database.php файле конфигурации:

    'client' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_CLIENT_HOST', '127.0.0.1'),
        'port' => env('DB_CLIENT_PORT', '3306'),
        'database' => env('DB_CLIENT_DATABASE', 'forge'),
        'username' => env('DB_CLIENT_USERNAME', 'forge'),
        'password' => env('DB_CLIENT_PASSWORD', ''),
        // and so on
    ],

В моем файле миграции я oop через всех клиентов хочу перезапустить каждую миграцию один раз для каждого клиента:

public function up()
{
    foreach (\App\Models\Clients\Client::all() as $client){

        if($client->hasCompleteDatabaseConnectionDetails()){

            $client->establishDatabaseConnection();

            Schema::connection('client')->create('pages', function (Blueprint $table) {
                $table->bigIncrements('id');
                $table->string('meta_title')->nullable();
                $table->string('meta_description')->nullable();
                $table->string('title')->nullable();
                $table->timestamps();
            });
        }
    }
}

И, наконец, мои соответствующие методы в моей модели клиента :

public function hasCompleteDatabaseConnectionDetails(): bool
{
    return !is_null($this->db_host)
        && !is_null($this->db_port)
        && !is_null($this->db_user)
        && !is_null($this->db_name)
        && !is_null($this->db_password);
}

public function couldConnectToDatabase(): bool
{
    try {
        DB::connection('client')->statement('SELECT TRUE');
        config(['client.can_connect_to_database' => true]);
    } catch (\Exception $ex) {
        config(['client.can_connect_to_database' => false]);
    }
    return config('client.can_connect_to_database');
}

protected function setDatabaseConnectionInConfig(): void
{
    config(['database.connections.client.host' => $this->db_host]);
    config(['database.connections.client.port' => $this->db_port]);
    config(['database.connections.client.database' => $this->db_name]);
    config(['database.connections.client.username' => $this->db_user]);
    config(['database.connections.client.password' => $this->db_password]);
}

public function establishDatabaseConnection(): void
{
    if ($this->hasCompleteDatabaseConnectionDetails()) {
        config(['client.has_qualified_database_credentials' => true]);
        $this->setDatabaseConnectionInConfig();
        if($this->couldConnectToDatabase()){
            config(['client.can_connect_to_database' => true]);
        } else {
            config(['client.can_connect_to_database' => false]);
        }
    } else {
        config(['client.has_qualified_database_credentials' => false]);
    }
}

Когда я запускаю php artisan migrate, я получаю сообщение об ошибке, в котором говорится, что не удалось подключиться с помощью пользователя "" @ "localhost". Так что приложение почему-то не сохраняет учетные данные. Как я могу это исправить? Я не хочу добавлять новое соединение в database.php для каждого нового клиента, поскольку новые клиенты должны быть добавляемыми из веб-интерфейса, поэтому текущее соединение должно динамически настраиваться.

1 Ответ

1 голос
/ 21 января 2020

Ваше соединение уже было кэшировано Laravel, поэтому любые изменения в конфигурации базы данных не будут иметь никакого эффекта, пока вы не запустите DB::purge($connection).

public function couldConnectToDatabase(): bool
{
    try {
        DB::purge('client');
        DB::connection('client')->statement('SELECT TRUE');
        config(['client.can_connect_to_database' => true]);
    } catch (\Exception $ex) {
        config(['client.can_connect_to_database' => false]);
    }
    return config('client.can_connect_to_database');
}

Вы можете просмотреть Illuminate\Database\DatabaseManager.php для больше подсказок / информации о том, как работает соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...