无法通过级联删除删除或更新违反父行约束的情况

ThE*_*hOp 5 orm model symfony doctrine-orm symfony4

我有 2 个实体:信息可能的答案\n信息可以被视为一个问题,根据其类型,它可以有可能的答案。它还可以有一个子信息,如果父信息可能的答案,其中之一将触发子显示。

\n\n

信息类:

\n\n
/**\n * @ORM\\Entity(repositoryClass="App\\Repository\\InformationRepository")\n */\nclass Information\n{\n\n    use DateTrait;\n\n    /**\n     * @ORM\\Id()\n     * @ORM\\GeneratedValue()\n     * @ORM\\Column(type="integer")\n     */\n    private $id;\n\n    /**\n     * @var string\n     *\n     * @ORM\\Column(type="string")\n     * @Assert\\NotBlank()\n     */\n    private $name;\n\n    /**\n     * @var string\n     *\n     * @ORM\\Column(type="string")\n     * @Assert\\NotBlank()\n     */\n    private $type;\n\n    /**\n     * @ORM\\OneToMany(targetEntity="App\\Entity\\PossibleAnswer", mappedBy="information", cascade={"persist", "remove"}, orphanRemoval=true)\n     */\n    private $possibleanswers;\n\n    /**\n     * One Information has Many Informations.\n     * @ORM\\OneToMany(targetEntity="Information", mappedBy="parent", cascade={"remove"}, orphanRemoval=true)\n     * @ORM\\OrderBy({"rank" = "ASC"})\n     */\n    private $children;\n\n    /**\n     * Many Informations have One Information.\n     * @ORM\\ManyToOne(targetEntity="Information", inversedBy="children")\n     */\n    private $parent;\n\n    /**\n     * r\xc3\xa9ponse qui d\xc3\xa9clenche une sous question\n     * @ORM\\ManyToOne(targetEntity="PossibleAnswer")\n     */\n    private $trigger;\n
Run Code Online (Sandbox Code Playgroud)\n\n

可能的答案类别:

\n\n
/**\n * @ORM\\Entity(repositoryClass="App\\Repository\\PossibleAnswerRepository")\n */\nclass PossibleAnswer\n{\n\n    use DateTrait;\n\n    /**\n     * @ORM\\Id()\n     * @ORM\\GeneratedValue()\n     * @ORM\\Column(type="integer")\n     */\n    private $id;\n\n    /**\n     * @ORM\\ManyToOne(targetEntity="App\\Entity\\Information", inversedBy="possibleanswers")\n     */\n    private $information;\n\n    /**\n     * @var string\n     *\n     * @ORM\\Column(type="string")\n     * @Assert\\NotBlank()\n     */\n    private $value;\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想删除特定信息并删除每个可能的答案或子信息。但有些删除案例不起作用:

\n\n
    \n
  1. 单一信息:好的
  2. \n
  3. 带孩子的信息 信息 : 可以
  4. \n
  5. 包含可能答案的信息:好的
  6. \n
  7. 包含可能答案的信息触发子信息:KO
  8. \n
  9. 与孩子有关的信息 可能的答案:KO
  10. \n
\n\n

在情况 4 中:

\n\n
\n

使用参数 [28] 执行 \'DELETE FROM possible_answer\n WHERE id = ?\' 时发生异常:

\n\n

SQLSTATE[23000]: 完整性约束冲突: 1451 无法删除或更新父行: 外键约束失败\n ( . evisa, informationCONSTRAINT FK_297918835FDDDCD6FOREIGN KEY\n ( trigger_id) REFERENCES possible_answer( id))

\n
\n\n

案例5:

\n\n
\n

使用参数 [56] 执行“DELETE FROM information WHERE\n id = ?\”时发生异常:

\n\n

SQLSTATE[23000]: 完整性约束冲突: 1451 无法删除或\n 更新父行: 外键约束失败\n ( db. possible_answer, CONSTRAINT FK_3D79739D2EF03101FOREIGN\n KEY ( information_id) REFERENCES information( id))

\n
\n\n

我在级联中遗漏了一些东西,无法正确删除所有内容,但我找不到它是什么。

\n

小智 7

您正在使用 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 ,有些是 Snake_case 。