无法使用级联删除删除或更新 parent 行约束冲突

Cannot delete or update a parent row constraint violation with cascade remove

我有 2 个实体:信息可能的答案 信息可以看作是一个问题,根据它的类型,它可以有可能的答案。它也可以有一个 child 信息,如果 parent 信息PossibleAnswers,其中之一会触发 child dipslay。

信息 class :

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

可能的答案 class :

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

现在我想删除一个特定的信息并删除每一个 PossibleAnswer 或 child 信息。但是有些删除案例不起作用:

  1. 单身信息:OK
  2. 信息 child 信息:OK
  3. 包含可能答案的信息:好的
  4. 包含触发 child 信息的 PossibleAnswers 的信息:KO
  5. 包含 child 可能答案的信息:KO

情况4:

An exception occurred while executing 'DELETE FROM possible_answer WHERE id = ?' with params [28]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (evisa.information, CONSTRAINT FK_297918835FDDDCD6 FOREIGN KEY (trigger_id) REFERENCES possible_answer (id))

案例 5:

An exception occurred while executing 'DELETE FROM information WHERE id = ?' with params [56]:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (db.possible_answer, CONSTRAINT FK_3D79739D2EF03101 FOREIGN KEY (information_id) REFERENCES information (id))

我在级联中遗漏了正确删除所有内容的内容,但我找不到它是什么。

您正在使用 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.