web-dev-qa-db-ja.com

データベース接続を動的に切り替える

いくつかのコンソールコマンドでは、データベースを変更して、すべての雄弁なコマンドとクエリを正しいデータベース(およびサーバー)で実行する必要があります。

私はいくつかの解決策を見てきましたが、最も簡単なのは次のように設定を変更することです:

$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
19
Parampal Pooni

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として宣言されているため、省略できます。

7
Sylwit

接続の名前を文字列として引数としてDB :: connection()ファサードに渡すことができます。

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

2
Indyz

同様の問題が発生していました。トランザクションを使用するには、基本的に@Sylwitのアプローチを使用する必要があります。

必要なデータベース接続を作成します。 mysqlmysql1

コントローラで、次のように必要なデータベースへの接続を取得します。

$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
2
jaysingkar
$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);

私はこれをテストし、それは仕事を成し遂げる

1
Kliment

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でテスト接続を参照します。

1
Sari Yono