Мое приложение имеет несколько клиентов, каждый из которых имеет собственную базу данных. Приложение для клиентов основано на плагинах, поэтому таблицы для каждого клиента имеют одинаковую структуру. Но клиент 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
для каждого нового клиента, поскольку новые клиенты должны быть добавляемыми из веб-интерфейса, поэтому текущее соединение должно динамически настраиваться.