关于删除Symfony4的外键和级联问题

时间:2019-12-06 14:23:49

标签: symfony

一个实体项目可以有很多人,很多小伙伴,每个项目一个高概念。用户可以有很多项目。然后,当我要删除项目时,出现以下错误消息:

  

在执行“ DELETE FROM projets WHERE id =?”时发生异常。带有参数[2]:

     

SQLSTATE [23000]:违反完整性约束:1451无法删除或更新父行:外键约束失败(config.xmlwrittle,CONSTRAINT personnages外键({{ 1}})参考文献FK_286738A6C18272projet_id))

这是我的实体:

人物实体

projets

Projet实体

id

Chapitre实体

/**
     * @ORM\ManyToMany(targetEntity="App\Entity\Chapitre", mappedBy="personnages")
     * @ORM\JoinColumn(name="projet_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $chapitres;

  /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Projets", inversedBy="personnages")
     * @ORM\JoinColumn(name="projet_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $projet;

HighConcept

/**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="projets")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Personnages", mappedBy="projet")

     */
    private $personnages;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Chapitre", mappedBy="projet", cascade={"remove"})
     * @ORM\joinColumn(onDelete="SET NULL")
     */
    private $chapitres;

用户实体

 /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Projets", inversedBy="chapitres")
     */
    private $projet;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Personnages", inversedBy="chapitres")
     */
    private $personnages;

我不知道该如何关联,我尝试了诸如 /** * @ORM\OneToOne(targetEntity="App\Entity\Projets", cascade={"persist", "remove"}) */ private $projet; /** * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="highconcepts") */ private $user; /** * @ORM\OneToMany(targetEntity="App\Entity\Projets", mappedBy="user") */ private $projets; /** * @ORM\OneToMany(targetEntity="App\Entity\Highconcept", mappedBy="user") */ private $highconcepts; JoinColumn之类的事情...  我看到了一些主题,但我认为我使用正确。

1 个答案:

答案 0 :(得分:0)

考虑到您要删除项目中包含的所有实体,建议您使用Doc中所述的orphanRemoval选项。

  

还有一个级联概念,仅当从集合中删除实体时才相关。如果类型A的实体包含对私有实体B的引用,则如果删除了从A到B的引用,则也应删除实体B,因为不再使用它。

使您实体的成员看起来像:

/**
* @ORM\OneToMany(targetEntity="App\Entity\Personnages", mappedBy="projet", orphanRemoval=true)
*/
private $personnages;