【问题标题】:Symfony3 - Delete Entity with OneToMany - relationship in Doctrine - cascade not workingSymfony3 - 使用 OneToMany 删除实体 - 教义中的关系 - 级联不起作用
【发布时间】:2018-05-21 09:23:07
【问题描述】:

我有两个实体:

/**
 * 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]:违反完整性约束:1451 无法删除或 更新父行:外键约束失败 (edutalk.teaching_event, 约束FK_F2B1088B57042871 外国 关键(time_table_entry_id)参考time_table_entry(id))

我可以尝试什么来解决这个问题?

【问题讨论】:

  • 请分享您的实体,而不仅仅是一个 sn-p。
  • 好的,我做到了;)

标签: symfony doctrine-orm entity-relationship


【解决方案1】:

我无法评论您的帖子,所以我将其发布为答案。

您的问题是您有另一个实体TeachingEvent 引用TimeTableEntry。当您尝试删除 TimeTableEntry 时,这是不可能的,因为此 time_table_entry_id 在 TeachingEvent 表中仍被引用为外键。

在删除TimeTableEntry 之前,首先应该取消它与TeachingEvent 的链接。我没有您的代码,但根据 TimeTableEntry 和 TeachingEvent 的相互关系,可能类似于:

$teachingEvent->setTimeTableEntry(null);

或

$timeTableEntry->setTeachingEvent(null);

【讨论】:

  • 太棒了!有时就这么简单。谢谢你!
猜你喜欢
  • 2015-02-14
  • 2018-10-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
相关资源
最近更新 更多