2015-05-31 223 views
0

我有相關的實體。多對多關係和註釋存在於只有一個實體:刪除相關實體Symfony2

/** 
* @ORM\ManyToMany(targetEntity="Event") 
* @ORM\JoinTable(name="viewed_events", 
*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id")} 
*  ) 
**/ 
protected $viewedEvents; 

問題是,當我試圖刪除事件實體,我得到Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails錯誤。我該如何解決這個問題?我嘗試加入orphanRemoval=true,如下所示:@ORM\ManyToMany(targetEntity="Event", orphanRemoval=true)並嘗試加入cascade="delete"cascade="all",但沒有成功。

回答

1
onDelete="CASCADE" 

你們都要JoinColumn。

2

我給你一個簡單的例子,這樣你就可以計算出你需要在你的應用程序中添加/修改什麼。

假設學生和課程實體之間存在M-N關係。

學生

class Student 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="studentInverse", cascade={"persist", "remove"}) 
    */ 
    protected $studentInverse; 

    public function __construct() 
    { 
     $this->studentInverse = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
} 

課程

class Course 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="courseMap", cascade={"persist", "remove"}) 
    */ 
    protected $courseInverse; 

    public function __construct() 
    { 
     $this->courseInverse = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 
} 

STUDENTCOURSE(這個你在更感興趣的)

class StudentCourse 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Course", inversedBy="courseInverse") 
    * @ORM\JoinColumn(name="course", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
    */ 
    protected $courseMap; 

    /** 
    * @ORM\ManyToOne(targetEntity="Student", inversedBy="studentInverse") 
    * @ORM\JoinColumn(name="student", referencedColumnName="id", nullable=false, onDelete="CASCADE") 
    */ 
    protected $studentMap; 
}