2016-12-28 7 views
1

Je travaille sur un système de base de données multiples. Le système intégrera les clients du serveur mssql local.DB :: reconnect() dans Schema Facade?

Je vais stocker les informations d'identification dans ma base de données master. Et je veux migrer certaines tables vers la base de données locale de mes clients.

Comme vous le savez, nous pouvons choisir la connexion comme ci-dessous.

Schema::connection('sqlsrv')->create('products', function (Blueprint $table) { 

}); 

Mais je dois l'utiliser dynamiquement.

Cette connexion lit de config/database.php

'connections' => [ 

    'sqlite' => [ 
     'driver' => 'sqlite', 
     'database' => env('DB_DATABASE', database_path('database.sqlite')), 
     'prefix' => '', 
    ], 

    'mysql' => [ 
     'driver' => 'mysql', 
     'host' => env('DB_HOST', 'localhost'), 
     'port' => env('DB_PORT', '3306'), 
     'database' => env('DB_DATABASE', 'forge'), 
     'username' => env('DB_USERNAME', 'forge'), 
     'password' => env('DB_PASSWORD', ''), 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
     'strict' => false, 
     'engine' => null, 
    ], 

    'sqlsrv' => [ 
     'driver' => 'sqlsrv', 
     'host'  => env('SQLSRV_HOST', 'localhost'), 
     'database' => env('SQLSRV_DATABASE', 'forge'), 
     'username' => env('SQLSRV_USERNAME', 'forge'), 
     'password' => env('SQLSRV_PASSWORD', ''), 
     'collation' => 'Turkish_CI_AS', 
     'charset' => 'utf8', 
     'prefix' => env('SQLSRV_PREFIX', ''), 
    ], 

    'pgsql' => [ 
     'driver' => 'pgsql', 
     'host' => env('DB_HOST', 'localhost'), 
     'port' => env('DB_PORT', '5432'), 
     'database' => env('DB_DATABASE', 'forge'), 
     'username' => env('DB_USERNAME', 'forge'), 
     'password' => env('DB_PASSWORD', ''), 
     'charset' => 'utf8', 
     'prefix' => '', 
     'schema' => 'public', 
    ], 

], 

Je l'ai fait à l'aide de DB Façade.

public function getConnection($connection_id) 
{ 
    /** Bağlantı Bilgilerini Çeker */ 
    $connection = Connection::find($connection_id); 

    try 
    { 
     /** Bağlantı Ayarları */ 
     config()->set('database.connections.sqlsrv.host', $connection->host); 
     config()->set('database.connections.sqlsrv.database', $connection->db); 
     config()->set('database.connections.sqlsrv.username', $connection->username); 
     config()->set('database.connections.sqlsrv.password', $connection->password); 
     config()->set('database.connections.sqlsrv.charset', $connection->charset); 
     config()->set('database.connections.sqlsrv.collation', $connection->collation); 
     config()->set('database.connections.sqlsrv.prefix', $connection->prefix); 

     /** Ayarlar ile yeniden bağlanma */ 
     return DB::reconnect($connection->driver); 
    }catch (\Exception $e) 
    { 
     throw new \Exception($e); 
    } 
} 

Existe-t-il une méthode ou une solution telle que DB :: reconnect() dans Schema Facade?

+0

Actuellement à la recherche de quelque chose comme ça. Avez-vous trouvé une solution pour Schema? –

+0

non je n'ai pas encore trouvé de solution –

Répondre

1

Voici ce que j'ai fini par faire. J'espère que ça aide votre cas.

// Erase the tenant connection, thus making Laravel 
    // get the default values all over again. 
    DB::purge('tenant'); 

    // Make sure to use the database name we want to establish a connection. 
    Config::set('database.connections.tenant.host', $company->database->main_server); 
    Config::set('database.connections.tenant.database', $company->mysql_database); 
    Config::set('database.connections.tenant.username', $company->mysql_username); 
    Config::set('database.connections.tenant.password', $company->mysql_password); 

    // Rearrange the connection data 
    DB::reconnect('tenant'); 

    // Ping the database. This will thrown an exception in case 
    // the database does not exists. 
    Schema::connection('tenant')->getConnection()->reconnect(); 

je remarquai que si vous ne DB::purge, le schéma ne sera pas en mesure de ramasser tout changement de connexion. D'autre part, si vous purgez, mais la base de données n'existe pas, vous n'obtiendrez pas une exception tant que vous n'essayez pas de faire quelque chose avec la connexion à la base de données. Le reconnect() dans la dernière ligne déclenchera cela.