Как не затереть данные при сохранении 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();


Насколько это правильно? На сколько я понимаю запросы на обновление и запись будут выполнены последовательно?
  • Вопрос задан
  • 285 просмотров
Пригласить эксперта
Ответы на вопрос 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]);

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

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

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

Похожие вопросы