coderisimo
@coderisimo

Как победить Undefined index в UnitOfWork при сохранении внутри postRemove?

В предмете новичок. Пишу логи в таблицу. При удалении сущности в листнере postRemove пытаюсь сделать так
$this->entityManager->persist($logRecord);
 $this->entityManager->flush();


чаще всего отрабатывает без ошибок. Но иногда получаю ошибку (возможно, когда имею дело со связанными сущностями)

Symfony\Component\Debug\Exception\ContextErrorException: Notice: Undefined index: 0000000045c434420000000058164e1f in /var/www/vim/back/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2917 Stack trace: #0 /var/www/vim/back/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php(522): Doctrine\ORM\UnitOfWork->getEntityIdentifier(Object(VimBundle\Entity\ViewArea)) 

#1 /var/www/vim/back/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php(452): Doctrine\ORM\Persisters\Collection\ManyToManyPersister->collectJoinTableColumnParameters(Object(Doctrine\ORM\PersistentCollection), Object(VimBundle\Entity\ViewArea)) 

#2 /var/www/vim/back/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Collection/ManyToManyPersister.php(71): Doctrine\ORM\Persisters\Collection\ManyToManyPersister->getDeleteRowSQLParameters(Object(Doctrine\ORM\PersistentCollection), Object(VimBundle\Entity\ViewArea)) 

#3 /var/www/vim/back/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(400): Doctrine\ORM\Persisters\Collection\ManyToManyPersister->update(Object(Doctrine\ORM\PersistentCollection)) 

#4 /var/www/vim/back/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php(356): Doctrine\ORM\UnitOfWork->commit(NULL) 

#5 /var/www/vim/back/var/cache/dev/ContainerBahllwd/EntityManager_9a5be93.php(170): Doctrine\ORM\EntityManager->flush(NULL) 

#6 /var/www/vim/back/src/VimBundle/EventListener/DoctrineEventListener/ChangesLogListener.php(447): EntityManager_9a5be93->flush()


В доке утонул. ))
Подскажите, куда копать.
Спасибо
  • Вопрос задан
  • 878 просмотров
Решения вопроса 1
@Flying
В документации к событию postRemove прямо указано что это событие вызывается внутри метода flush(). Таким образом вызывая $this->entityManager->flush() внутри postRemove вы, фактически порождаете потенциально бесконечный цикл, поэтому "Undefined index" на самом деле - наименьшая из ваших проблем :)

Более корректно будет организовать работу примерно следующим образом:
  1. Вынести логику сохранения изменений в отдельный сервис
  2. Обернуть процесс сохранения изменений в транзакцию
  3. В lifecycle методах не пытаться писать данные сразу, а вместо этого собирать информацию для записи в некую коллекцию, в простейшем случае - массив
  4. После основного flush'а проверять содержимое коллекции и если там что-то есть - формировать отдельный набор изменений в entities и делать новый flush.
  5. Если всё прошло хорошо - в конце делать commit транзакции
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sl0
Тут надо смотреть на структуру таблиц. Может забыл где прописать inversedBy (было у меня такое), может c индексами напутано. Проверь внимательно все моменты, где используются связи и коллекции.
Ответ написан
Ваш ответ на вопрос

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

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