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

Как обновлять другой документ в обработчиках событий Doctrine MongoDB ODM?

общее описание прожекта

Несвежий крупный проект на Symfony 4.4 и MongoDB. Doctrine ODM 2.2.3.
У сущности Заказа есть дочерние сущности "Задача", которые бывают разных типов.
При изменении статуса у Задачи типа-А с "X" на "Y", надо у Задачи типа-Б того же Заказа, тоже изменить статус, если текущий имеет значение "K" — на "L".

TL&DR Когда меняется определённым образом один документ, нужно что-то поменять в другом документе.

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

Поэтому можно сохранять в классе обработчика массив кандидатов на изменения. И при другом событии, postPersist или postFlush ? – эти изменения уже воплощать.

Но что-то у меня пока не получается. В обработчике postFlush я нахожу нужный документ, меняю ему поля, добавляю ему в коллекцию новый вложенный под-объект. Но и $dm->persist($doc) и пляски с unitOfWork и recomputeSingleDocumentChangeSet() не сохраняют желаемые изменения в базе.

Что я делаю не так, и может, Listeners – не лучшее место для такой задачи?

P.S. тега "Doctrine ODM" тут нет, поэтому пришлось поставить "Doctrine ORM". События и аргументы слушателей наследуются от них, в любом случае.
  • Вопрос задан
  • 48 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

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

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