web-dev-qa-db-fra.com

Basculer dynamiquement la connexion à la base de données

Pour plusieurs commandes de la console, j'ai besoin de changer de base de données pour que toutes mes commandes et requêtes éloquentes s'exécutent sur la base de données (et le serveur) adéquates.

J'ai vu quelques solutions, la plus simple semble changer la configuration de la manière suivante:

$new_connection = [
        'driver'    => 'mysql',
        'Host'      => '127.0.0.1',
        'database'  => 'test_db',
        'username'  => 'test',
        'password'  => 'test',
        'charset'   => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix'    => '',
        'strict'    => false
];

config(['database.connections.mysql' => $new_connection]);
DB::purge('mysql');

Le seul problème (que j'ai remarqué) est lorsque je tente d'effectuer des transactions, plus précisément lorsque je fais des transactions dans le cadre de mes tests d'acceptation dans Codeception: elles ne fonctionnent tout simplement pas.

Les commandes que j'utilise sont:

DB::connection()->beginTransaction(); // inside the _before function

et 

DB::connection()->rollBack(); // inside the _after function
18
Parampal Pooni

Vous devez créer 2 connexions distinctes

http://fideloper.com/laravel-multiple- database -connectionshttps://laravel.com/docs/5.1/database#accessing-connections

return array(
    'default' => 'mysql',

    'connections' => array(

        # Our primary database connection
        'mysql' => array(
          'driver'    => 'mysql',
          'Host'      => '127.0.0.1',
          'database'  => 'test_db',
          'username'  => 'test',
          'password'  => 'test',
          'charset'   => 'utf8',
          'collation' => 'utf8_general_ci',
          'prefix'    => '',
          'strict'    => false
        ),

        # Our secondary database connection
        'mysql2' => array(
          'driver'    => 'mysql',
          'Host'      => '127.0.0.1',
          'database'  => 'test_db_2',
          'username'  => 'test',
          'password'  => 'test',
          'charset'   => 'utf8',
          'collation' => 'utf8_general_ci',
          'prefix'    => '',
          'strict'    => false
        ),
    ),
);

Maintenant, lorsque vous voulez interroger, vous devez passer la connexion dont vous avez besoin

$users = DB::connection('mysql2')->select(...);

Comme celui par défaut est déclaré comme mysql, vous pouvez l'omettre.

6
Sylwit

Vous pourriez passer une chaîne avec le nom de la connexion en argument à la façade DB :: connection (). 

https://laravel.com/docs/5.3/database#using-multiple-database-connections

2
Indyz

Je vivais le même problème. Pour utiliser la transaction, vous devez utiliser l'approche de @Sylwit.

Créez les connexions de base de données requises. Disons mysql et mysql1.

Maintenant, dans votre contrôleur, connectez-vous à la base de données requise comme ci-dessous:

$connection = DB::connection('mysql1'); // replace this to your required connection name

Maintenant, pour la transaction, utilisez la connexion récupérée.

$connection->beginTransaction(); // inside the _before function

Et

$connection->rollBack(); // inside the _after function

OU

Dans votre code, vous pouvez simplement ajouter le nom de la connexion:

DB::connection('mysql1')->beginTransaction(); // inside the _before function

et

DB::connection('mysql1')->rollBack(); // inside the _after function
2
jaysingkar
$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);

J'ai testé cela et il fait le travail

1
Kliment

si vous utilisez phpunit, regardez phpunit.xml

dans le bas, vous devriez voir ce qui suit 

    <php>
    <env name="APP_ENV" value="testing"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
    </php>

vous pouvez affecter la variable env de votre base de tests à utiliser plutôt que la base de données de production d'origine.

donc, créez deux connexions, attribuez le nom de connexion à la base de données dans le fichier .env et faites référence au test dans le fichier phpunit.xml Bonne chance.

1
Sari Yono