2015-10-30 10 views
0

так это мой prePersist на EventListenerдоктрина 2 каскада не проходят экономии слишком много

public function prePersist(LifecycleEventArgs $args) 
    { 
     //the first entity will have the PMP, so we catch it and continue to skip this if after this 
     if ($this->pmp == null) { 
      $this->pmp = $args->getEntity()->getPmp(); 
     } 

     $taxonomicClass = $args->getEntity(); 

     if($taxonomicClass instanceof TaxonomicClass){ 

      if(is_null($taxonomicClass->getId())){ 
       //here it says that i have created a new entity, need to persist it via cascade={"persist"} 
       $taxonomicClass->setPmp($this->pmp); 
      } 
     } 
    } 

это нормально, я добавил аннотацию на нем:

/** 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Pmp", cascade={"persist"}) 
    * @ORM\JoinColumn(name="pmp_id", referencedColumnName="id", nullable=false) 
    **/ 
    private $pmp; 

и сохраняет все из моей иерархии, даже новый PMP, объект, который уже существует в базе данных!

Я хочу, чтобы все, что мне удалось сохранить из моей иерархии, должно быть связано с PMP, которое я передал, но когда я установил $taxonomicClass->setPmp($this->pmp);, доктрина думает, что я создал новый экземпляр PMP, так как им нет, я просто хочу к этому парню есть ассоциатив с PMP.

Я попытался поставить merge на вариант каскада, но он работает только с persist, как заставить doctrine не создавать новый экземпляр и вместо этого использовать тот, который я передал?

ответ

0

заметил мою проблему, я назначал атрибут из памяти, я должен извлечь его из базы данных, чтобы понять доктрину.

public function prePersist(LifecycleEventArgs $args) 
{ 
    if ($this->pmp == null) { 
      $this->pmp = $args->getEntity()->getPmp(); 
    } 

    $taxonomicClass = $args->getEntity(); 

    if($taxonomicClass instanceof TaxonomicClass){ 

     if(is_null($taxonomicClass->getId())){ 
      //this solved the problem 
      $pmp = $args->getEntityManager()->getRepository("AppBundle:Pmp")->find($this->pmp->getId()); 
      $taxonomicClass->setPmp($pmp); 
     } 
    } 
} 

я буду иметь в виду, теперь, когда создается новый объект, но он не должен быть сохранен, необходимо извлечь его из БД, cascade={"persist"} не было даже необходимости