【发布时间】:2014-02-28 16:22:52
【问题描述】:
是否可以检查preUpdate 钩子上的字段是否已更改?我正在寻找类似 @987654322@ hasChangedField($fieldName) Doctrine 功能的东西。有什么想法吗?
【问题讨论】:
标签: symfony doctrine-orm sonata-admin
是否可以检查preUpdate 钩子上的字段是否已更改?我正在寻找类似 @987654322@ hasChangedField($fieldName) Doctrine 功能的东西。有什么想法吗?
【问题讨论】:
标签: symfony doctrine-orm sonata-admin
对我来说,在 Sonata Admin 中最好的方法是:
$newField = $this->getForm()->get('field')->getData();
$oldField = $this->getForm()->get('field')->getConfig()->getData();
除非别无选择,否则不应使用工作单元。此外,如果您有未映射的字段,则无法通过实体对象访问它。
在正常的 Doctrine 生命周期事件中,最佳选择是 Doctrine preupdate event doc
【讨论】:
这个问题有点像this one
您的解决方案只是将旧对象的字段与新对象的字段进行比较,看看它们有何不同。
例如:
public function preUpdate($newObject)
{
$em = $this->getModelManager()->getEntityManager($this->getClass());
$originalObject = $em->getUnitOfWork()->getOriginalEntityData($newObject);
if ($newObject->getSomeField() !== $originalObject['fieldName']) {
// Field has been changed
}
}
【讨论】:
getOriginalDocumentData),对于 mysql,我使用了 getOriginalEntityData。此外,该函数返回数组,所以我必须通过$originalObject['fieldName'] 引用。如果您能更新您的答案,那就太好了。