Let's suppose I retrieve an entity $e
and modify its state with setters:
$e->setFoo('a');
$e->setBar('b');
Is there any possibility to retrieve an array of fields that have been changed?
In case of my example I'd like to retrieve foo => a, bar => b
as a result
PS: yes, I know I can modify all the accessors and implement this feature manually, but I'm looking for some handy way of doing this
You can use
DoctrineORMEntityManager#getUnitOfWork
to get aDoctrineORMUnitOfWork
.Then just trigger changeset computation (works only on managed entities) via
DoctrineORMUnitOfWork#computeChangeSets()
.You can use also similar methods like
DoctrineORMUnitOfWork#recomputeSingleEntityChangeSet(DoctrineORMClassMetadata $meta, $entity)
if you know exactly what you want to check without iterating over the entire object graph.After that you can use
DoctrineORMUnitOfWork#getEntityChangeSet($entity)
to retrieve all changes to your object.Putting it together:
Note. If trying to get the updated fields inside a preUpdate listener, don't recompute change set, as it has already been done. Simply call the getEntityChangeSet to get all of the changes made to the entity.
Warning: As explained in the comments, this solution should not be used outside of Doctrine event listeners. This will break Doctrine's behavior.