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 的链接。我没有你的代码,但根据 TimeTableEntryTeachingEvent 之间的关系,它可能类似于:

$teachingEvent->setTimeTableEntry(null);

$timeTableEntry->setTeachingEvent(null);