PankovAlxndr
@PankovAlxndr
Fullstack web developer

Вложенные транзациии Laravel + MySQL?

Здравствуйте, начну издалека.

мне нужно сохранить, допустим товары, причем сохранять их надо группами.
на вход получаем массив из товаров, допустим 500 шт

я их должен расфасовать, в моей логике на сейчас группы по: гендеру курьера и пункту выдачи заказа
те я из 500 товаров должен сформировать "кучки" для муж\жен, в каждой из этих кучек создать кучки с одинаковым пвз
такая структура выходит:
--[gender-1]
-----[pvz-1]
...........
-----[pvz-n]
--[gender-2]
----[pvz-1]
...........
----[pvz-n]

далее я запускаю вложенный цикл (по гендеру + по пункту выдачи этого гендера), который создает данные в бд
в цикле вызывается метод, на вход которого текущая кучка товаров, которую он сохраняет
этот самый метод внутри себя обернут в транзакцию (так как кучу всего надо создать при сохранении группы товаров)

и вот тут проблема, что если у нас вышло 10 групп, 7 мы создали, на 8ой какая-то ошибка
мне нужно откатить вообще все, все 7 созданных успешно до этого групп, а не только текущую

поэтому я хотел взять и обвернуть все еще в одну транзацию, те создание товаров как транзация, а над ней еще одна транзация, как раз этот самый цикл, про который писал выше)

но смотрю на код и прям пахнет... посоветуйте что тут можно сделать?

// [gender-1]
//      [pvz-1]
//      [pvz-n]
// [gender-2]
//      [pvz-1]
//      [pvz-n]

// тут тоже обвернуть в транзакцию ?

foreach ($groups as $byGender){
    foreach ($byGender as $byPoint){
        $service->create($byPoint); // внутри транзакция
    }
}

чот тип такого (понимаю, что говно, если добавиться еще 10 фильтров для группировки, то все, приехали, тут нужна более плоская структура, но это пока не важно, щас разобраться с вложенными транзакциями хочется)

Нижняя транзакция нужна как накрути, создание группы товаров (метод create) кто угодно откуда угодно может вызвать

Этот код, на мой взгляд, очень пахнет(возможно он даже не будет работать), как можно сделать лучше?
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
Fragster
@Fragster
помогло? отметь решением!
Проблема высосана из пальца.
Если смущают вложенные транзакции (почему?) можно внутрь сервиса создания вместо безусловного старта транзакции проверять её наличие https://laravel.com/api/master/Illuminate/Support/... и взводить флаг. Если необходимо, то создавать и фиксировать транзакцию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы