Laravel 5.8 инициирует DB ::beginTransaction() в другой базе данных для каждого пользователя

#eloquent #laravel-5.8

#eloquent #laravel-5.8

Вопрос:

У меня есть приложение, в котором пользователь владеет своей собственной базой данных. Я создаю сохранение записи, которая включает в себя связь (таким образом, обновляются две таблицы), и я хочу завершить выполнение с помощью 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, это сохранит запись в таблице из первого 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. Может быть, это хорошая идея не создавать отдельную базу данных для каждого пользователя? Может быть причина, по которой это неправильно работает в Laravel.

Ответ №1:

Используйте 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();
 }