Laravel BD ::rollBack не работает в моем коде

#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