How to check if entity changed in Doctrine 2?

前端 未结 9 687
盖世英雄少女心
盖世英雄少女心 2020-12-23 20:53

I need to check if a persisted entity has changed and needs to be updated on the database. What I made (and did not work) was the following:

$product = $enti         


        
相关标签:
9条回答
  • 2020-12-23 21:17

    I am curious about Doctrine and everyone documenting postFlush, as in some case, you have an ongoing transaction. I'd like to point out there's also postTransactionCommit, which could be safer depending on what you're trying to achieve in the postFlush event.

    0 讨论(0)
  • 2020-12-23 21:18

    The first thing I'd check it that your setName function is actually doing something ($this-> name = $name...) If it's already working, then you could define an event listener on your services.yml that is triggered when you call the flush.

    entity.listener:
      class: YourName\YourBundle\EventListener\EntityListener
      calls:
        - [setContainer,  ["@service_container"]]
      tags:
        - { name: doctrine.event_listener, event: onFlush }
    

    Then you define the EntityListener

    namespace YourName\YourBundle\EventListener;
    
    use Doctrine\ORM\Event;
    use Symfony\Component\DependencyInjection\ContainerAware;
    
    class EntityListener extends ContainerAware
    {   
    
        /**
         * Gets all the entities to flush
         *
         * @param Event\OnFlushEventArgs $eventArgs Event args
         */
        public function onFlush(Event\OnFlushEventArgs $eventArgs)
        {   
            $em = $eventArgs->getEntityManager();
            $uow = $em->getUnitOfWork();
    
            //Insertions
            foreach ($uow->getScheduledEntityInsertions() as $entity) {
                # your code here for the inserted entities
            }
    
            //Updates
            foreach ($uow->getScheduledEntityUpdates() as $entity) {
                # your code here for the updated entities
            }
    
            //Deletions
            foreach ($uow->getScheduledEntityDeletions() as $entity) {
                # your code here for the deleted entities
            }
        }
    }
    

    If you need to know which entities are being changed, but do something with them after they've been saved to the database, just store the entities changed in a private array, an then define a onFlush event that gets the entities from the array.

    BTW, to trigger this kind of events you need to add the @ORM\HasLifecycleCallbacks on the entity.

    0 讨论(0)
  • 2020-12-23 21:23

    You may also want to look at the PreUpdate event, if you need access to entity fields with their old and new values.

    A bit of an example mostly taken from the link provided:

    <?php
    class NeverAliceOnlyBobListener
    {
        public function preUpdate(PreUpdateEventArgs $eventArgs)
        {
            if ($eventArgs->getEntity() instanceof User) {
                if ($eventArgs->hasChangedField('name') && $eventArgs->getNewValue('name') == 'Alice') {
                    $oldValue = $eventArgs->getOldValue('name');
                    $eventArgs->setNewValue('name', 'Bob');
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题