2016-08-11 2 views
15

Для нескольких консольных команд мне нужно изменить базы данных, чтобы все мои красноречивые команды и запросы выполнялись на правильном 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 
+0

Попробуйте позвонить 'Artisan :: вызов («конфигурации: кэш»);' перед изменением конфигурации. Я думаю, что ваша конфигурация уже кэширована и не позволяет ей изменять – Kliment

+0

@Kliment я попытался вызвать 'config: cache', но получить эту ошибку =' '' [Symfony \ Component \ Debug \ Exception \ FatalErrorException] Объявление Symfony \ Component \ Консоль \ Вход \ ArrayInput :: hasParameterOption() должна быть совместима с Symfony \ Component \ Console \ Input \ InputInterface :: hasParameterOption ($ values, $ onlyParams = false) '' ' –

+0

Можете ли вы уточнить второе соединение. Вы хотите заменить соединение для всех своих запросов при использовании набора команд или вы хотите использовать 2 подключения и сможете переключать свои запросы? – Sylwit

ответ

5

Вы должны создать 2 distincts соединения

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, вы можете пропустить его.

+0

Ввод' DB :: connection ('mysql2') 'перед всеми моими запросами и указанием соединения в моих моделях не так эффективно, как просто изменение соединения один раз (например,' config (['database.connections.mysql' => $ new_connection]); '). Я просто не понимаю, почему транзакции не работают ... –

+0

Вы изменяете структуру базы данных в своей транзакции, потому что это может быть причиной, почему она не работает. Структурный запрос автоматически выполнит транзакцию. Можете ли вы разместить свой запрос, пожалуйста? Также вы сказали, что хотите новое соединение только для некоторых команд, поэтому вам просто нужно указать на тезисы запросов – Sylwit

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 
+0

Его не так просто; мой код вызова (для всех запросов) должен был бы измениться на .. –

+0

@ParampalPooni да, я понимаю ... не уверен, что это сработает, но вы можете определить все необходимые соединения в файле 'config/database.php' , Затем измените подключение по умолчанию к нужному соединению с помощью метода 'setDefaultConnection()' в контроллере – jaysingkar

1

если вы используете 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 Удачи.

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

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

Смежные вопросы