每当我尝试删除实体"候选"时,我都会收到此错误:
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();
当我删除实体:"测试"时,实体:"答案"将自动删除,因为它从那里级联。