2016-05-07 2 views
5

мне нужно скопировать подмножество записей из одной базы данных в другой в Laravel 4,2Laravel 4.2: Копирование записей базы данных из одной базы данных в другую

я написал ремесленник задачу, которая загружает модель, которые мне нужно скопировать из соединения по умолчанию «по умолчанию», и теперь необходимо сохранить их во второе соединение с базой данных (которое определено в config/database.php). Я не могу найти способ использования метода save() модели для сохранения в базе данных, отличной от соединения по умолчанию.

Возможно ли это? Могу ли я «надавить» мои данные на второе соединение с базой данных? Или мне нужно перейти на логику «pull», отменить определения подключения к базе данных и загрузить данные из «второго» соединения перед сохранением в «default»?

ответ

1

Как @Filip указал, что необходимо установить соединение на модели ко второй (назначения) базы данных перед сохранением модели.

Однако необходимо установить id на нуль (если вы не уверены, что во второй базе данных нет записи с этим идентификатором, что я не мог), чтобы обеспечить выделение нового значения возрастающего идентификатора.

И его также необходимо установить свойство exists модели на false перед сохранением. Это значение равно true в модели после прочтения записи из исходной базы данных, поскольку запись была успешно прочитана оттуда (а не была создана как новая запись). Не удалось перезагрузить exists, и Laravel попытался выполнить команду UPDATE WHERE id = $model->id, которая ничего не записывала в базу данных, потому что не было подходящей записи (с нулевым идентификатором) для обновления. Установка exists - false гарантирует, что сохранение будет выполняться как INSERT.

1

Прежде всего, вы должны определить secoundary соединение в app/conifg/database.php, а затем в connections, например:

'second_db_conn' => [ 
     'driver' => 'mysql', 
     'host'  => $_SERVER['MYSQL_HOST'], 
     'database' => $_SERVER['MYSQL_DATABASE'], 
     'username' => $_SERVER['MYSQL_USERNAME'], 
     'password' => $_SERVER['MYSQL_PASSWORD'], 
     'charset' => 'utf8', 
     'collation' => 'utf8_unicode_ci', 
     'prefix' => '', 
    ], 

Затем установить эту связь на YOUT модели - сохранить его - и вернуться в режим по умолчанию (в моем примером является mysql):

$model->setConnection('second_db_conn')->save(); 
$model->setConnection('mysql'); 
+1

Спасибо, я, наконец, решил, что мне нужно установить соединение в модели .... кроме того, я обнаружил, что это попыталось выполнить транзакцию UPDATE, а не INSERT .... решение заключалось в том, чтобы явно установить ' $ model-> exists = false' перед выполнением 'save()', в противном случае свойство 'exists' всегда было истинным при чтении из первого соединения с базой данных, поэтому Laravel рассматривал его как UPDATE, а UPDATING не работал, если запись уже существует во второй базе данных –

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