2016-07-06 70 views
0

我已经主义实体的以下设置:更新集合(onFlush)

class MainEntity 
{ 
    /** 
    * @var SecondEntity[] 
    * 
    * @ORM\OneToMany(targetEntity="SecondEntity", mappedBy="mainEntity", cascade={"persist"}) 
    */ 
    private $secondEntities; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer", nullable=false, name="second_entities_count") 
    */ 
    private $secondEntitiesCount; 

    ... 
} 

class SecondEntity 
{ 
    /** 
    * @var MainEntity 
    * 
    * @ORM\ManyToOne(targetEntity="MainEntity", inversedBy="secondEntities") 
    * @ORM\JoinColumn(name="main_entity_id", referencedColumnName="id", nullable=false) 
    */ 
    private $mainEntity; 

    ... 
} 

当创建或删除SecondEntity,我想$secondEntitiesCount在相关MainEntity将相应更新。

要做到这一点,我已经创建了一个onFlush订户聚集SecondEntity对象

$delsertions = array_merge(
    $unitOfWork->getScheduledEntityInsertions(), 
    $unitOfWork->getScheduledEntityDeletions() 
); 
foreach ($delsertions as $entity) { 
    if ($entity instanceof SecondEntity) { 
     $mainEntity = $entity->getMainEntity(); 

     $mainEntityMeta = $em->getClassMetadata(MainEntity::class); 
     $unitOfWork->recomputeSingleEntityChangeSet($mainEntityMeta, $mainEntity); 

     dump($mainEntity->getSecondEntities); // The creation/deletion of the current entity is not reflected here! 
    } 
} 

的问题是,在上述dump(),收集尚未因此在创建之后更新的所有计划的缺失和插入/删除触发用户的实体。例如,如果我为给定的MainEntity创建第一个SecondEntity,则$secondEntities集合将为空。 如果我删除了唯一的SecondEntity,那么$secondEntities集合仍然会在其中包含该对象。 在这种情况下,recomputeSingleEntityChangeSet()调用似乎没有做任何事情。

我该如何强制收集才能正确更新?

回答

0

您可以创建这样的监听器:

use Doctrine\ORM\Event\LifecycleEventArgs; 

class UpdateMainListener 
{ 
    public function prePersist(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     // only act on "SecondEntity" entity 
     if (!$entity instanceof SecondEntity) { 
      return; 
     } 

     $main = $entity->getMainEntity(); 
     if(!is_null($main)) 
      $main->increaseSecondEntitiesCount(); 
    } 

    public function preRemove(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     // only act on "SecondEntity" entity 
     if (!$entity instanceof SecondEntity) { 
      return; 
     } 

     $main = $entity->getMainEntity(); 
     if(!is_null($main)) 
      $main->decreaseSecondEntitiesCount(); 
    } 
} 

,然后设置服务:

mybundle.prepersist.listener: 
    class: MyBundle\EventListener\UpdateMainListener 
    tags: 
     - { name: doctrine.event_listener, event: prePersist } 
mybundle.preremove.listener: 
    class: MyBundle\EventListener\UpdateMainListener 
    tags: 
     - { name: doctrine.event_listener, event: preRemove }