#database #laravel
#База данных #laravel
Вопрос:
Я создал приведенный ниже код для проверки транзакции, в которой баланс и история будут сохранены в базе данных или ни один из них. Однако, когда я запускаю код и проверяю базу данных, я вижу, что баланс все еще вводится в банк, а не отменяется. В чем может быть ошибка?
Ниже приведен код метода моей модели баланса, отвечающий за операцию
public function deposit(float $value) : Array {
DB::beginTransaction();
$totalBefore = null;
// $totalBefore = $this->amount ? $this->amount : 0;
$this->amount = number_format($value, 2, ".", '');
$deposit = $this->save();
$historic = auth()->user()->historics()->create([
'type' => 'I',
'amount' => $value,
'total_before' => $totalBefore,
'total_after' => $this->amount,
'date' => date('Ymd'),
]);
if ($deposit amp;amp; $historic) {
DB::commit();
return [
'success' => true,
'message' => 'Sucesso ao recarregar!'
];
}
else {
DB::rollBack();
return [
'success' => false,
'message' => 'Falha ao recarregar!'
];
}
}
Комментарии:
1. В чем собственно проблема? Если одно из значений сохранено, другое также должно присутствовать. Это не то, что происходит?
2. Проблема в том, что я хотел настроить код так, чтобы поиск разыменовывался, если значения не могут быть введены или были какие-либо ошибки. Например, если вы не смогли ввести историю, баланс также больше не будет сохранен. В этом случае баланс поступает на депозит.
Ответ №1:
Когда вы используете save(), db::rollBack() не выполняет откат.
Комментарии:
1. Это должно быть, не так ли?
2. Но в этом случае, как более эффективный метод для этой операции? Я хочу только обновить этот баланс (депозит) или создать новый, если он не существует.
3. Затем используйте метод updateOrCreate, как описано здесь: laravel.com/docs/5.8/eloquent