Symfony - 使用 OneToMany 删除实体 - Doctrine 中的关系 - 级联不起作用
Symfony3 - Delete Entity with OneToMany - relationship in Doctrine - cascade not working
我有两个实体:
/**
* Course
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\CourseRepository")
*/
class Course
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\ArrayCollection()
*
* @ORM\OneToMany(targetEntity="AppBundle\Entity\TimeTableEntry", mappedBy="course", cascade={"remove"}, orphanRemoval=true)
*
*/
private $timeTableEntries;
/**
* @var boolean
*
* @ORM\Column(name="enabled", type="boolean", nullable=true)
*/
private $enabled;
和
/**
* TimeTableEntry
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\TimeTableEntryRepository")
*/
class TimeTableEntry
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\ArrayCollection()
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="timeTableEntries", cascade={"ALL"})
* @ORM\JoinColumn(name="course_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
private $course;
如您所见,我尝试使用 cascade={"ALL"}、onDelete="CASCADE" 和 orphanRemoval=true。
当我想删除课程实体时收到错误消息:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or
update a parent row: a foreign key constraint fails
(edutalk
.teaching_event
, CONSTRAINT FK_F2B1088B57042871
FOREIGN
KEY (time_table_entry_id
) REFERENCES time_table_entry
(id
))
我该如何解决这个问题?
我无法评论您的 post,所以我 post 将其作为答案。
您的问题是您有另一个实体 TeachingEvent
引用了 TimeTableEntry
。当您尝试删除 TimeTableEntry
时,这是不可能的,因为此 time_table_entry_id
仍被引用为 TeachingEvent
table.
中的外键
在删除 TimeTableEntry
之前,首先您应该取消它与 TeachingEvent
的链接。我没有你的代码,但根据 TimeTableEntry
和 TeachingEvent
之间的关系,它可能类似于:
$teachingEvent->setTimeTableEntry(null);
或
$timeTableEntry->setTeachingEvent(null);
我有两个实体:
/**
* Course
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\CourseRepository")
*/
class Course
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\ArrayCollection()
*
* @ORM\OneToMany(targetEntity="AppBundle\Entity\TimeTableEntry", mappedBy="course", cascade={"remove"}, orphanRemoval=true)
*
*/
private $timeTableEntries;
/**
* @var boolean
*
* @ORM\Column(name="enabled", type="boolean", nullable=true)
*/
private $enabled;
和
/**
* TimeTableEntry
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\TimeTableEntryRepository")
*/
class TimeTableEntry
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \Doctrine\Common\Collections\ArrayCollection()
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Course", inversedBy="timeTableEntries", cascade={"ALL"})
* @ORM\JoinColumn(name="course_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
private $course;
如您所见,我尝试使用 cascade={"ALL"}、onDelete="CASCADE" 和 orphanRemoval=true。
当我想删除课程实体时收到错误消息:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (
edutalk
.teaching_event
, CONSTRAINTFK_F2B1088B57042871
FOREIGN KEY (time_table_entry_id
) REFERENCEStime_table_entry
(id
))
我该如何解决这个问题?
我无法评论您的 post,所以我 post 将其作为答案。
您的问题是您有另一个实体 TeachingEvent
引用了 TimeTableEntry
。当您尝试删除 TimeTableEntry
时,这是不可能的,因为此 time_table_entry_id
仍被引用为 TeachingEvent
table.
在删除 TimeTableEntry
之前,首先您应该取消它与 TeachingEvent
的链接。我没有你的代码,但根据 TimeTableEntry
和 TeachingEvent
之间的关系,它可能类似于:
$teachingEvent->setTimeTableEntry(null);
或
$timeTableEntry->setTeachingEvent(null);