我有相关的实体。多对多关系和注释仅存在于一个实体上:
/**
* @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"
,但没有成功。
答案 0 :(得分: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();
}
}
<强> COURSE 强>
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;
}
答案 1 :(得分:1)
onDelete="CASCADE"
On Yours JoinColumn。