2016-10-28 62 views
1

這裏有3個實體:Doctrine2 /傳遞集合元素到另一個收集

實體A

class EntityA 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"all"}, orphanRemoval=true) 
    */ 
    protected $entitiesB; 

    public function __construct() 
    { 
     $this->entitiesB = new ArrayCollection(); 
    } 

    public function getEntitiesB() 
    { 
     return $this->entitiesB; 
    } 

    public function setEntitiesB($entitiesB) 
    { 
     $this->entitiesB = new ArrayCollection(); 

     return $this->addEntitiesB($entitiesB); 
    } 

    public function addEntityB(EntityB $entityB) 
    { 
     if (!$this->entitiesB->contains($entityB)) 
     { 
      $this->entitiesB->add($entityB); 
      $entityB->setEntityA($this); 
     } 

     return $this; 
    } 

    public function addEntitiesB($entitiesB) 
    { 
     foreach ($entitiesB as $entityB) 
     { 
      $this->addEntityB($entityB); 
     } 

     return $this; 
    } 

    public function removeEntityB(EntityB $entityB) 
    { 
     if ($this->entitiesB->contains($entityB)) 
     { 
      $this->entitiesB->removeElement($entityB); 
     } 

     return $this; 
    } 

    public function removeEntitiesB($entitiesB) 
    { 
     foreach ($entitiesB as $entityB) 
     { 
      $this->removeEntityB($entityB); 
     } 

     return $this; 
    } 
} 

實體B

class EntityB 
{ 
    /** 
    * 
    * @ORM\OneToMany(targetEntity="EntityC", mappedBy="entityB", cascade={"all"}, orphanRemoval=true) 
    */ 
    protected $entitiesC; 

    /** 
    * @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entitiesB") 
    * @ORM\JoinColumn(name="entity_a_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $entityA; 

    public function __construct() 
    { 
     $this->entitiesC = new ArrayCollection(); 
    } 

    public function getEntityA() 
    { 
     return $this->entityA; 
    } 

    public function setEntityA(EntityA $entityA) 
    { 
     $this->entityA = $entityA; 
     $entityA->addEntityB($this); 

     return $this; 
    } 

    public function getEntitiesC() 
    { 
     return $this->entitiesC; 
    } 

    public function setEntitiesC($entitiesC) 
    { 
     $this->entitiesC = new ArrayCollection(); 

     return $this->addEntitiesC($entitiesC); 
    } 

    public function addEntityC(EntityC $entityC) 
    { 
     if (!$this->entitiesC->contains($entityC)) 
     { 
      $this->entitiesC->add($entityC); 
      $entityC->setEntityB($this); 
     } 

     return $this; 
    } 

    public function addEntitiesC($entitiesC) 
    { 
     foreach ($entitiesC as $entityC) 
     { 
      $this->addEntityC($entityC); 
     } 

     return $this; 
    } 

    public function removeEntityC(EntityC $entityC) 
    { 
     if ($this->entitiesC->contains($entityC)) 
     { 
      $this->entitiesC->removeElement($entityC); 
     } 

     return $this; 
    } 

    public function removeEntitiesC($entitiesC) 
    { 
     foreach ($entitiesC as $entityC) 
     { 
      $this->removeEntityC($entityC); 
     } 

     return $this; 
    } 
} 

實體Ç

class EntityC 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="EntityB", inversedBy="entitiesC") 
    * @ORM\JoinColumn(name="entity_b_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $entityB; 

    public function getEntityB() 
    { 
     return $this->entityB; 
    } 

    public function setEntityB(EntityB $entityB) 
    { 
     $this->entityB = $entityB; 
     $entityB->addEntityC($this); 

     return $this; 
    } 
} 

所以,現在,假設我們有這樣的數據:

EntityA [ 
    EntitiesB [ 
     EntityB1 [ 
      EntitiesC [ 
       EntityC1 
       EntityC2 
       EntityC3 
      ] 
     ] 
     EntityB2 [ 
      EntitiesC [ 
       EntityC4 
      ] 

     ] 
    ] 
] 

那我要的是EntityC4轉移到EntityB1[EntitieC] collection

爲了實現這個目標,該過程將是:

- EntityB2.EntitiesC::removeEntityC(EntityC4) 
- EntityB1.EntitiesC::addEntity(EntityC4) 

但它不會做的伎倆... EntityC4被刪除,而不是轉移!

因此,它適用於 EntityB.EntitiesC,但我想保留這個Doctrine標誌。

難道這是另一種方法來實現嗎?

感謝您的想法。

回答

1

如果你讀了教義文檔chapter 8.7. Orphan Removal你可以看到如下:

當使用orphanRemoval=true選項原則,使假設實體私人擁有和將其他實體重複使用。如果你忽略了這個假設,即使你將孤立實體分配給另一個實體,你的實體也會被Doctrine刪除。

在我看來,這正是你在這種情況下犯的錯誤。 在這種情況下,您根本無法使用orphanRemoval

+0

是的,我也讀過,並得出了相同的結論 – ceadreak

相關問題