原则 ORM 错误:外键约束失败



每当我尝试删除实体"候选"时,我都会收到此错误:

An exception occurred while executing 'DELETE FROM candidate WHERE id = ?' with params {"1":3}: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`ima`.`result`, CONSTRAINT `result_ibfk_2` FOREIGN KEY (`test_id`) REFERENCES `Test` (`id`))

以下是所涉及的教义ORM实体的关系:

实体:候选人

/**
 * @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;

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

除非您

删除该候选人的相应测试,否则您无法删除候选人。这是一个数据库问题,就像您删除cadidates一样,他进行的测试会发生什么?在该外键上,它应该被set null on delete

我也看到您在候选类中的代码中使用了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();
当我删除实体

:"测试"时,实体:"答案"将自动删除,因为它从那里级联。

最新更新