Динамическое подключение db-соединения

Для нескольких консольных команд мне нужно изменить базы данных, чтобы все мои красноречивые команды и запросы выполнялись на правильном db (и сервере).

Я видел несколько решений, простейший, похоже, меняет конфигурацию так:

$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

Ответы

Ответ 1

Вам нужно создать 2 различных соединения

http://fideloper.com/laravel-multiple-database-connections https://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, вы можете его опустить.

Ответ 2

У меня возникла аналогичная проблема. Чтобы использовать транзакцию, вам в основном нужно будет использовать подход @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

Ответ 4

если вы используете 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 для вашей базы данных тестирования, а не исходную производственную базу данных.

создайте два подключения, назначьте имя подключения к базе данных в .env и обратитесь к тестовому в phpunit.xml Удачи.

Ответ 5

$config = config()->all();
$config['database']['connections']['mysql'] = $newConnection;
Artisan::call('config:clear');
config($config);

Я тестировал это, и он выполняет работу