#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();
}