Orm 错误:外键约束失败

Orm 错误:外键约束失败,orm,doctrine,Orm,Doctrine,每当我试图删除/删除实体“候选者”时,就会出现此错误: 以下是相关实体的关系: 实体:候选人 /** * @OneToMany(targetEntity="Test", mappedBy="candidate", * cascade={"persist"}) * * @var ArrayCollection */ private $tests; 实体:测试 /** * @ManyToOne(targetEntity="Candidate", inversedBy="tests")

每当我试图删除/删除实体“候选者”时,就会出现此错误:

以下是相关实体的关系:

实体:候选人

/**
 * @OneToMany(targetEntity="Test", mappedBy="candidate",
 * cascade={"persist"})
 * 
 * @var ArrayCollection
 */
private $tests;
实体:测试

/**
 * @ManyToOne(targetEntity="Candidate", inversedBy="tests")
 * @JoinColumn(name="candidate_id", referencedColumnName="id", onDelete="cascade")
 */
private $candidate;

 /**
 * @OneToMany(targetEntity="Answer", mappedBy="test", cascade={"persist", "remove"})
 * @var ArrayCollection
 */
private $answers;

/**
 * @OneToMany(targetEntity="Result", mappedBy="test", cascade={"persist"})
 * @var ArrayCollection
 */
private $results;
实体:答案

/**
 * @ManyToOne(targetEntity="Test", inversedBy="answers")
 * @JoinColumn(name="test_id", referencedColumnName="id")
 */
private $test;
实体:结果

/**
 * @ManyToOne(targetEntity="Test", inversedBy="results")
 */
protected $test;

我做错了什么?请帮忙。谢谢。

除非删除候选人的相应测试,否则不能删除候选人。这是一个db问题,好像你删除了cadidates,他参加的测试会怎么样?在该外键上,它应该在删除时设置为空


我还看到您在候选类的代码中使用了
cascade={“persist”}
。因此,从开始,您需要先删除这些测试,然后删除候选项本身(),您也可以使用其他级联方法)。请看那一段,因为它解释了你的问题。谢谢

我终于用枪手阿齐兹的提示解决了这个问题

// Delete results.
$test = $candidate->getLatestTest();
$results = $test->getResults();
foreach ($results as $result) {
        $em->remove($result);
        $em->flush();
}

// Delete test.
$em->remove($test);
$em->flush();

// Delete candidate
$em->remove($candidate);
$em->flush();
当我删除实体“Test”时,实体“Answer”将自动删除,因为它是从那里级联而来的

// Delete results.
$test = $candidate->getLatestTest();
$results = $test->getResults();
foreach ($results as $result) {
        $em->remove($result);
        $em->flush();
}

// Delete test.
$em->remove($test);
$em->flush();

// Delete candidate
$em->remove($candidate);
$em->flush();