いくつかのコンソールコマンドでは、データベースを変更して、すべての雄弁なコマンドとクエリを正しいデータベース(およびサーバー)で実行する必要があります。
私はいくつかの解決策を見てきましたが、最も簡単なのは次のように設定を変更することです:
$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');
(私が気付いた)唯一の問題は、トランザクションを実行しようとしたとき、より具体的には、Codeceptionの受け入れテスト内でトランザクションを実行したときです-それらは単に機能しません。
私が使用するコマンドは次のとおりです。
DB::connection()->beginTransaction(); // inside the _before function
そして
DB::connection()->rollBack(); // inside the _after function
2つの異なる接続を作成する必要があります
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
),
),
);
クエリを実行する場合は、必要な接続を渡す必要があります
$users = DB::connection('mysql2')->select(...);
デフォルトはmysqlとして宣言されているため、省略できます。
接続の名前を文字列として引数としてDB :: connection()ファサードに渡すことができます。
https://laravel.com/docs/5.3/database#using-multiple-database-connections
同様の問題が発生していました。トランザクションを使用するには、基本的に@Sylwitのアプローチを使用する必要があります。
必要なデータベース接続を作成します。 mysql
とmysql1
。
コントローラで、次のように必要なデータベースへの接続を取得します。
$connection = DB::connection('mysql1'); // replace this to your required connection name
ここで、トランザクションには取得した接続を使用します。
$connection->beginTransaction(); // inside the _before function
そして
$connection->rollBack(); // inside the _after function
[〜#〜]または[〜#〜]
コードでは、接続名を追加するだけです。
DB::connection('mysql1')->beginTransaction(); // inside the _before function
そして
DB::connection('mysql1')->rollBack(); // inside the _after function
$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);
私はこれをテストし、それは仕事を成し遂げる
phpunitを使用している場合は、phpunit.xml
下部に次が表示されます
<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>
オリジナルの本番データベースではなく、使用するテストデータベースにenv変数を割り当てることができます。
したがって、2つの接続を作成し、.envでデータベース接続名を割り当て、phpunit.xml Good Luckでテスト接続を参照します。