Как совершить только часть транзакции PHP? - PullRequest
0 голосов
/ 31 марта 2019

Мне нужны идеи для решения проблемы, когда есть заказ, который нужно обновить, и платежи, которые будут созданы для этого заказа.Но если зарядка заказа не удалась.Обновления, внесенные в заказ, должны быть отменены, но созданные для него платежи должны сохраняться.

Пример кода контроллера:

$order = Order::find(1);

DB::beginTransaction();

    try {

        $order->update(['status' => 1]);
        chargeOrder ($order);

    } catch (PaymentErrorException $e) {

        DB::rollback();
        throw $e;

    } 
    catch (\Exception $e) {

        DB::rollback();
        throw $e;

    }


DB::commit();

Пример функции, которая выполняет начисление заказа:

function chargeOrder( $order ) {

    $payments_service->charge($order);
    $order->payments()->create( new Payment() );

}

Что мне нужно, так это то, что когда возникает исключение PaymentErrorException, следует отменять только $ order-> update (), но изменения, сделанные внутри функции chargeOrder, должны сохраняться.

1 Ответ

0 голосов
/ 31 марта 2019

Если я правильно понял вопрос:

$order = Order::find(1);
$previousStatus = $order->status;

DB::beginTransaction();

    try {

        $order->update(['status' => 1]);
        chargeOrder ($order);

    } catch (PaymentErrorException $e) {

        $order->update(['status' => $previousStatus]);

    } 
    catch (\Exception $e) {

        DB::rollback();
        throw $e;

    }

DB::commit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...