4

当没有实际更改属性时,如何手动安排实体进行更新?

我试过$entityManager->getUnitOfWork()->scheduleForUpdate($entity)了,但它在核心中给出了一个错误,我没有调试 Doctrine 的意图。

如果重要,则对实体进行管理:$entity = $repository->findOne(1)

我需要这个,所以教义会召唤我EventSubscriberflush()

我也尝试过类似的东西$entityManager->getEventManager()->dispatchEvent(\Doctrine\ORM\Events::preUpdate),但后来我的听众preUpdate()收到EventArgs了而不是PreUpdateEventArgs.

任何帮助表示赞赏!

4

4 回答 4

4

Wpigott 提到的方法对我不起作用(至少在学说/orm v2.4.2 中),而是我使用这个:

$entityManager->getUnitOfWork()->setOriginalEntityProperty(spl_object_hash($entity), 'field_name', '__fake_value__');

其中field_name存在的属性名称。

于 2014-04-15T15:56:22.130 回答
2

该解决方案有点hacky,但我能够通过执行以下操作来实现这一点。

$objectManager->getUnitOfWork()->setOriginalDocumentData($object, array('__fake_field'=>'1'));

这实质上会导致 Doctrine 认为文档已从原始文档更改,并将其计算为将导致事件在刷新时执行的更改。

该示例适用于 MongoODM 解决方案,但相同的技术应该适用于 ORM,如下所示。

$objectManager->getUnitOfWork()->setOriginalEntityData($object, array('__fake_field'=>'1'));
于 2014-04-03T20:54:49.153 回答
2

尽管这个问题有点老了,但我只是找到了一种更优雅的方法来解决我想使用 Doctrine ORM 2.6.2 在这里分享的这个问题:

您可以简单地告诉ClassMetadataInfo您的表的对象只是将这些字段声明为您传递propertyChangedUnitOfWork. 这里的重要部分是setChangeTrackingPolicypropertyChanged调用:

$unitOfWork = $entityManager->getUnitOfWork();
$classMeta  = $entityManager->getClassMetadata('Your\Table\Class');
$ctp        = $classMeta->changeTrackingPolicy; # not a function but a variable

# Tell the table class to not automatically calculate changed values but just
# mark those fields as dirty that get passed to propertyChanged function
$classMeta->setChangeTrackingPolicy(ORM\ClassMetadataInfo::CHANGETRACKING_NOTIFY);

# tell the unit of work that an value has changed no matter if the value
# is actually different from the value already persistent
$oldValue = $entity->getValue('fieldName'); # some custom implementation or something
$newValue = $oldValue;
$unitOfWork->propertyChanged($entity, 'fieldName', $oldValue, $newValue);

# field value will be updated regardless of whether its PHP value has actually changed
$entityManager->flush();

# set the change tracking policy back to the previous value to not mess things up
$classMeta->setChangeTrackingPolicy($ctp);

您可能还想看看Doctrine\Common\NotifyPropertyChanged界面。

我希望这对某人有用。

于 2018-11-09T09:28:30.850 回答
0

目标是什么?如果没有属性更改,您为什么要计划更新?

于 2012-12-25T13:42:22.447 回答