Динамическое подключение 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
Ответ 3
Вы можете передать строку с именем соединения в качестве аргумента для фасада DB:: connection().
https://laravel.com/docs/5.3/database#using-multiple-database-connections
Ответ 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);
Я тестировал это, и он выполняет работу