Задать вопрос

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


Насколько это правильно? На сколько я понимаю запросы на обновление и запись будут выполнены последовательно?
  • Вопрос задан
  • 296 просмотров
Подписаться 4 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 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]);

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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽