Как не затереть данные при сохранении Doctrine?

Здравствуйте сразу извинюсь за глупый вопрос. Как мне корректно сохранять запись в БД чтобы не затереть данные, которые возможно изменились в момент получения сущности Doctrine. В моем случае это какая-то статистика. Сейчас я делаю так:
$this->entity_manager->getConnection()->beginTransaction();
        $this->entity_manager->refresh($stats);
        $stats->applyDeltaData();
        $this->entity_manager->persist($stats);
        $this->entity_manager->flush();
        $this->entity_manager->getConnection()->commit();


Насколько это правильно? На сколько я понимаю запросы на обновление и запись будут выполнены последовательно?
  • Вопрос задан
  • 270 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
cloud_zurbag: когда вы вытягиваете данные из entityManager эти самые данные (сущности) начинают крутиться в Unit-of-work. Когда вы дергаете flush этот самый UoW (по умолчанию, поведение настраивается) сравнивает что было, что стало, генерирует SQL соответствующий и коммитит транзакцию (то есть все изменения уже обернуты в транзакцию, непонятно почему в описании вопроса еще раз в ручную оборачивается все). Потому очень даже легко, если случано поменять сущность где-то не в том месте, похерить данные (разве что СУБД вам транзакцию не даст закончить).

romteh

Самый простой способ устраить возможные факапы - убрать автоматическое добавление загруженный энтитей в UoW, что вынудит разработчика всегда делать persist (да, по умолчанию можно просто сделать flush при редактировании уже загруженной энтити).

Еще вариант - флашить только то, что поменялось:

$em->flush([$entity1, $entity2]);

будут вычислены изменения только этих двух сущностей и транзакция будет сформирована только для них. В этом случае игнорируются каскады и т.д.

Но вообще у меня к вам встречный вопрос, что статистика у вас делает в сущностях? Ей там не место (если конечно это не часть бизнес логики именно).
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
04 мая 2024, в 17:58
10000 руб./за проект
04 мая 2024, в 17:40
1000 руб./за проект
04 мая 2024, в 17:35
150000 руб./за проект