2017-10-31 18 views
2

は、私が2つのエンティティを持っています。それから私はManyToMany関係を持っています。多対多関係、orphanRemoval

しかし私の場合、リファレンスはLocusでリンクされていないと何も表示されません。私はBDDに保持したくありません。試してみるの

一覧:リファレンスによって所有

  • 関係:(所有側)ReferenceEntityで
    • orphanRemoval:軌跡を削除(InversedSide上)LocusEntityで
    • orphanRemoval :何もしない
  • Locusが所有する関係:
    • (InversedSide上)ReferenceEntityでorphanRemoval:LocusEntityで何
    • orphanRemoval(所有側)を実行します。他の軌跡

Reference.php

で使用されるが、リファレンスを削除
/** 
* Reference 
* 
* @ORM\Table(name="reference") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ReferenceRepository") 
*/ 
class Reference 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Locus", inversedBy="references") 
    */ 
    private $locus; 

    public function addLocus(Locus $locus) 
    { 
     if (!$this->locus->contains($locus)) { 
      $this->locus->add($locus); 
      $locus->addReference($this); 
     } 

     return $this; 
    } 

    public function removeLocus(Locus $locus) 
    { 
     if ($this->locus->contains($locus)) { 
      $this->locus->removeElement($locus); 
     } 

     return $this; 
    } 

    public function getLocus() 
    { 
     return $this->locus; 
    } 

Locus.php

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\LocusRepository") 
*/ 
class Locus extends GeneticEntry 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Reference", mappedBy="locus", orphanRemoval=true) 
    */ 
    private $references; 

    public function addReference(Reference $reference) 
    { 
     $this->references->add($reference); 

     return $this; 
    } 

    public function removeReference(Reference $reference) 
    { 
     if ($this->references->contains($reference)) { 
      $this->references->removeElement($reference); 
     } 

     return $this; 
    } 

    public function getReferences() 
    { 
     return $this->references; 
    } 
+1

あなたは作ってみることができますイベントonLocusDeletedので、関連する参照に関連性のないものが含まれているかどうかをチェックします。存在している場合はそれを削除します –

+0

はい、それはそうだと思いますが、なぜか分かりませんが、それを行うためにネイティブのドクトリンの方法を試して試してみる時間です。 – mpiot

答えて

0

私はpostUpdateイベントでのEventListenerを使用することを選択しました現時点で、私は空の場合、私はエンティティを削除し、ArrayCollectionのテストは:

ReferenceListener.php:

<?php 

namespace AppBundle\EventListener; 

use AppBundle\Entity\Reference; 
use Doctrine\ORM\Event\LifecycleEventArgs; 

class ReferenceListener 
{ 
    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $object = $args->getObject(); 
     if (!$object instanceof Reference) { 
      return; 
     } 

     // If the Reference have no Locus and no Chromosomes, delete it 
     if ($object->getLocus()->isEmpty() && $object->getChromosomes()->isEmpty()) { 
      $args->getEntityManager()->remove($object); 
      $args->getEntityManager()->flush(); 
     } 
    } 
}