Laravel 5.8 инициирует DB :: beginTransaction () в другой базе данных для пользователя - PullRequest
0 голосов
/ 26 марта 2019

У меня есть приложение, в котором пользователь владеет собственной БД. Я создаю запись сохранения, которая включает в себя отношения (поэтому две таблицы обновлены), и я хочу обернуть выполнение с DB::transaction(). Единственная проблема заключается в том, что имя БД должно меняться от пользователя к пользователю.

$user->db_name содержит ожидаемые данные и хорошо работает с другими запросами выбора.

Если я сделаю это, произойдет сбой с Call to a member function beginTransaction() on null

DB::disconnect(config('database.default'));
Config::set('database.connections.mysql.database', $user->db_name);

DB::beginTransaction();

try {
.
.
    $data1->create();
    $data2->create();

    DB::commit();
 } catch (\Exception $e) {
     DB::rollback();
 }

Если я сделаю это и вызову ошибку во втором операторе create, он сохранит запись в таблице с первого создания.

DB::beginTransaction();

try {

    DB::disconnect(config('database.default'));
    Config::set('database.connections.mysql.database', $user->db_name);

.
.
    $data1->create();
    $data2->create();

    DB::commit();
 } catch (\Exception $e) {
     DB::rollback();
 }

Как мне добиться изменения БД и транзакции с откатом при сбое в отношении БД пользователя? Спасибо

1 Ответ

0 голосов
/ 01 апреля 2019

Использование reconnect():

DB::reconnect(config('database.default'));
Config::set('database.connections.mysql.database', $user->db_name);

DB::beginTransaction();

try {
.
.
    $data1->create();
    $data2->create();

    DB::commit();
 } catch (\Exception $e) {
     DB::rollback();
 }
...