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
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.
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
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
$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);
Ich habe das getestet und es wird erledigt
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.