我有2个实体:信息和 PossibleAnswer 信息可视为一个问题,具体取决于其类型,它可能具有可能的答案。它还可以有一个子 Information ,如果父 Information 具有 PossibleAnswers ,则其中之一将触发子Dipslay。
信息类:
/**
* @ORM\Entity(repositoryClass="App\Repository\InformationRepository")
*/
class Information
{
use DateTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $name;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $type;
/**
* @ORM\OneToMany(targetEntity="App\Entity\PossibleAnswer", mappedBy="information", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $possibleanswers;
/**
* One Information has Many Informations.
* @ORM\OneToMany(targetEntity="Information", mappedBy="parent", cascade={"remove"}, orphanRemoval=true)
* @ORM\OrderBy({"rank" = "ASC"})
*/
private $children;
/**
* Many Informations have One Information.
* @ORM\ManyToOne(targetEntity="Information", inversedBy="children")
*/
private $parent;
/**
* réponse qui déclenche une sous question
* @ORM\ManyToOne(targetEntity="PossibleAnswer")
*/
private $trigger;
PossibleAnswer 类:
/**
* @ORM\Entity(repositoryClass="App\Repository\PossibleAnswerRepository")
*/
class PossibleAnswer
{
use DateTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
*/
private $information;
/**
* @var string
*
* @ORM\Column(type="string")
* @Assert\NotBlank()
*/
private $value;
现在,我想删除特定的信息,并删除所有可能的答案或子信息。但是某些删除案例不起作用:
第4种情况:
执行“ DELETE FROM可能性_answer”时发生异常 id =?'带有参数[28]:
SQLSTATE [23000]:违反完整性约束:1451无法删除或 更新父行:外键约束失败 ({
evisa
。information
,约束FK_297918835FDDDCD6
外键 ({trigger_id
)参考文献possible_answer
(id
))
情况5:
在执行“ DELETE FROM information WHERE”时发生异常 id =?'带有参数[56]:
SQLSTATE [23000]:违反完整性约束:1451无法删除或 更新父行:外键约束失败 ({
db
。possible_answer
,约束FK_3D79739D2EF03101
外国 KEY(information_id
参考(information
(id
))
我在级联中丢失了一些东西,无法正确删除所有内容,但是我找不到它。
答案 0 :(得分:2)
您正在使用ORM级别级联,您要尝试实现的是数据库级别级联http://www.inanzzz.com/index.php/post/6s4g/one-to-many-association-cascade-example-with-doctrine-annotations
您需要的是onDelete="CASCADE"
例如:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Information", inversedBy="possibleanswers")
* @JoinColumn(onDelete="CASCADE")
*/
private $information;
始终使用JoinColumn,您将可以更好地控制代码并手动命名列,否则最终将导致数据库混乱,某些名称将是CamelCase,某些是蛇形。