gpt4 book ai didi

orm - Doctrine 2.1 在 preUpdate lifeCycleCallback 中保留实体

转载 作者:行者123 更新时间:2023-12-02 10:08:40 24 4
gpt4 key购买 nike

我正在努力解决以下问题,在实体类中,我有一个 preUpdate lifeCycleCallback,它必须在刷新auditTrail的更改之前保留一个新实体。

在 preRemove 和 prePersist 中,这工作得很好,但在 preUpdate 中什么也没有发生。如果我自己调用flush,它就会进入递归循环。

根据 Google 教条用户组的说法,将其放入 onFlush 中应该是一个选项,但在这种情况下,我无法访问实体的旧值以将这些旧值保存在新的其他实体中以进行审计跟踪。

我想要存档的一些小例子:

<?php
/**
* @Entity
* @HasLifeCycleCallbacks
*/
class someEntity {
... annotations ...


/**
* @PreUpdate
*/
public function addAuditTrail() {
$em = \Zend_Registry::get('doctrine')->getEntityManager();

$entity = new AuditTrail();
$entity->action = 'update';
$entity->someField = $this->someField;

$em->persist($entity); //this just doesn't do anything :-(
}
}
?>

这不是真正的代码,只是为了向您说明我想要的东西。我也尝试过这样的事情:

$em->getUnitOfWork()->computeChangeSet($em->getClassMetaData(get_class($entity)), $entity);

这应该根据这个主题工作:http://groups.google.com/group/doctrine-user/browse_thread/thread/bd9195f04857dcd4

如果我再次调用刷新,但这会导致 Apache 由于某些无限循环而崩溃。

有人给我出主意吗?谢谢!

最佳答案

您永远不应该在实体内使用实体管理器。如果您想添加审计跟踪,您应该将“SomeEntity”实体映射到“AuditTrail”实体并执行类似的操作

/**
* @PreUpdate
*/
public function addAuditTrail() {
$entity = new AuditTrail();
$entity->action = 'update';
$entity->someField = $this->someField;

$this->autitTrail->add($entity);
}

如果您在映射上设置级联选项,则当您保留“SomeEntity”时,它将被保留。

关于orm - Doctrine 2.1 在 preUpdate lifeCycleCallback 中保留实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com