当前位置:  开发笔记 > 编程语言 > 正文

Doctrine EventListener onFlush不保存原始实体

如何解决《DoctrineEventListeneronFlush不保存原始实体》经验,为你挑选了1个好方法。

我一直在努力解决烦人的问题.我正在尝试创建与InventoryItems过期关联的通知实体.

这些InventoryItems是为用户自动生成的,但用户可以编辑它们并单独设置它们的到期日期.保存后,如果InventoryItem具有到期日期,则生成通知实体并将其关联.因此,当实体更新时会创建这些通知实体,因此onPersist事件不起作用.

一切似乎都运行良好,并在按预期保存InventoryItems时生成通知.唯一的问题是,当第一次创建通知时,即使它已正确保存,也不会保存对InventoryItem的更改.即创建了具有正确到期日期的通知,但有效期未保存在InventoryItem上.

这是我的onFlush代码:

 public function onFlush(OnFlushEventArgs $args)
{
    $em  = $args->getEntityManager();
    $uow = $em->getUnitOfWork();
    foreach ($uow->getScheduledEntityUpdates() as $entity) {
        if ($entity instanceof NotificableInterface) {
          if ($entity->generatesNotification()){
              $notification = $this->notificationManager->generateNotificationForEntity($entity) ;
              if ( $notification ) {
                  $uow->persist($notification) ; 
              }
              $entity->setNotification($notification) ; 
              $uow->persist($entity);
              $uow->computeChangeSets();
          }
        }
    }
}

该问题仅在通知第一次与实体关联时发生,即第一次在InventoryItem上设置到期日期.在更新到期日期的后续实例中,更新将在Notification和InventoryItem上正确反映.

任何想法或建议将不胜感激.

谢谢



1> Richard..:

您需要专门在新创建或更新的实体上调用computeChangeset .仅调用computeChangeSets是不够的.

    $metaData = $em->getClassMetadata('Your\NameSpace\Entity\YourNotificationEntity');
    $uow->computeChangeSet($metaData, $notification);

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有