【问题标题】:Insert entity in preUpdate event在 preUpdate 事件中插入实体
【发布时间】:2014-11-10 11:41:36
【问题描述】:

每当Message 更新时,我都会尝试保持History 实体。我在幕后做了太多事情,无法在此处发布所有代码并使其有意义,但我基本上已将问题追溯到UnitOfWork::commit 方法。在那里,UOW 首先循环通过entityInsertions,没有发现任何东西,继续到entityUpdates。 UOW 的entityInsertions 在那里得到了更新,但由于它已经超过了那个循环,它没有发现它仍然需要保留一些实体。有什么办法可以强制 UOW “重启”这个过程?如果是这样,怎么做?我正在使用 Doctrine 2.4。

感谢您的帮助!

【问题讨论】:

  • 您必须至少发布更新前代码。
  • 如果你要持久化另一个实体,我认为你需要通知 UoW 来安排你的插入。

标签: symfony doctrine-orm


【解决方案1】:

这可能是有史以来最肮脏的解决方案,但我最终做的基本上是以下......

  1. 创建onFlush 事件订阅者
  2. 将整个容器注入订阅者(视为仅注入实体管理器会导致循环引用错误)
  3. 循环遍历UnitOfWorkscheduledEntityUpdatesscheduledEntityInserts(我对删除不感兴趣)
  4. 处理您感兴趣的每个计划更新或插入(在我的例子中,我用LoggableInterface 标记了我感兴趣的每个实体,只是为了知道哪些实体是可记录的)
  5. 使用处理程序链处理相关对象(这只是我自己的算法,你的可能不需要这个。这是为了以不同方式处理不同 LoggableInterface 对象的日志记录)
  6. 通过实体管理器持久化实体(实际的历史事件),并执行以下操作:

    $classMeta = $this->entityManager->getClassMetadata(get_class($historyEntity));
    $this->entityManager->getUnitOfWork()->computeChangeSet($classMeta, $historyEntity);
    
  7. 利润

希望这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多