webentwicklung-frage-antwort-db.com.de

Wechseln Sie die DB-Verbindung dynamisch

Bei einigen Konsolenbefehlen muss ich die Datenbanken ändern, sodass alle eloquenten Befehle und Abfragen auf der richtigen Datenbank (und dem richtigen Server) ausgeführt werden.

Ich habe ein paar Lösungen gesehen, die einfachste scheint die Konfiguration so zu ändern:

$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');

Das einzige Problem (ich habe es bemerkt) ist, wenn ich versuche, Transaktionen durchzuführen, genauer gesagt, wenn ich Transaktionen innerhalb meiner Akzeptanztests in Codeception durchführe - sie funktionieren einfach nicht.

Die Befehle, die ich verwende, sind:

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

und 

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

Sie müssen 2 unterschiedliche Verbindungen erstellen

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
        ),
    ),
);

Wenn Sie jetzt abfragen möchten, müssen Sie die benötigte Verbindung übergeben

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

Da der Standard als mysql deklariert ist, können Sie ihn weglassen.

6
Sylwit

Sie können einen String mit dem Namen der Verbindung als Argument an die DB :: connection () - Fassade übergeben. 

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

2
Indyz

Ich hatte ein ähnliches Problem. Um die Transaktion zu verwenden, müssen Sie grundsätzlich den Ansatz von @Sylwit verwenden.

Erstellen Sie die erforderlichen Datenbankverbindungen. Sagen wir mysql und mysql1.

Nun erhalten Sie in Ihrem Controller die Verbindung zur erforderlichen Datenbank wie folgt:

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

Verwenden Sie nun für Transaktionen die abgerufene Verbindung.

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

Und

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

ODER

In Ihrem Code können Sie einfach den Verbindungsnamen hinzufügen:

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

und

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

Ich habe das getestet und es wird erledigt

1
Kliment

wenn Sie phpunit verwenden, sehen Sie sich phpunit.xml an.

unten sollte man folgendes sehen 

    <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>

sie können die env-Variable für Ihre Testdatenbank anstelle der ursprünglichen Produktionsdatenbank zuweisen.

erstellen Sie also zwei Verbindungen, weisen Sie den Namen der Datenbankverbindung in der .env zu und verweisen Sie auf die Testverbindung in der phpunit.xml Viel Glück.

1
Sari Yono