教义实体的跟踪字段更改

问题描述 投票:8回答:2

我想跟踪对一个Doctrine实体字段的更改。我使用Symfony 2.5.0和Doctrine 2.2.3。

到目前为止,我有一个EventSubscriber订阅了preUpdate。在这里,我想创建一个新实体,该实体存储新值和旧值,并保存对已更新实体的引用。

问题是,我找不到持久化此新实体的方法。如果我persist()中的preUpdateflush()中的postUpdate,则仅更改一个实体就可以工作。如果更改了多个实体,则会收到一个错误消息,指出变更集为空。

我尝试摆弄具有不同结果的不同事件。空白页,跟踪实体不会保留等。

我认为这应该是一个常见的用例-但我找不到示例。

php entity-framework symfony doctrine-orm
2个回答
13
投票

不要使用preUpdate或postUpdate,您会遇到问题。来看看onFlush

此时,您可以访问完整的变更集,因此,您可以找出更改了哪些字段,添加了哪些内容等。您还可以安全地保留新实体。请注意,正如[C​​0]所说,当您保留或更改实体时,您将不得不重新计算更改集。

一个简单的例子,我敲在一起,未经测试,但与此类似的东西可以让您得到想要的东西。

docs

3
投票

您可能对public function onFlush(OnFlushEventArgs $args) { $entityManager = $args->getEntityManager(); $unitOfWork = $entityManager->getUnitOfWork(); $updatedEntities = $unitOfWork->getScheduledEntityUpdates(); foreach ($updatedEntities as $updatedEntity) { if ($updatedEntity instanceof YourEntity) { $changeset = $unitOfWork->getEntityChangeSet($updatedEntity); if (array_key_exists('someFieldInYourEntity', $changeset)) { $changes = $changeset['someFieldInYourEntity']; $previousValueForField = array_key_exists(0, $changes) ? $changes[0] : null; $newValueForField = array_key_exists(1, $changes) ? $changes[1] : null; if ($previousValueForField != $newValueForField) { $yourChangeTrackingEntity = new YourChangeTrackingEntity(); $yourChangeTrackingEntity->setSomeFieldChanged($previousValueForField); $yourChangeTrackingEntity->setSomeFieldChangedTo($newValueForField); $entityManager->persist($yourChangeTrackingEntity); $metaData = $entityManager->getClassMetadata('YourNameSpace\YourBundle\Entity\YourChangeTrackingEntity'); $unitOfWork->computeChangeSet($metaData, $yourChangeTrackingEntity); } } } } } 感兴趣。

它允许配置应跟踪的实体。然后,它介绍了数据库revisions的概念。每个修订版都有时间戳,用户名和受影响的实体列表。

然后,您可以找到影响特定实体的所有修订:

EntityAudit bundle

或在特定版本中实例化:

$revisions = $auditReader->findRevisions('AppBundle\Entity\Article', 1);

因此您可以轻松比较实体的当前状态和旧状态。

该捆绑包还附带示例视图,演示如何显示修订列表,比较不同版本的对象等等。>>

$oldArticle = $auditReader->find( 'AppBundle\Entity\Article', $id = 1, $rev = 2 );

selecting comparison

© www.soinside.com 2019 - 2024. All rights reserved.