【问题标题】:Foreign key and cascade problems on delete Symfony4删除 Symfony4 的外键和级联问题
【发布时间】:2019-12-06 14:23:49
【问题描述】:

一个实体项目可以有很多人,很多章,每个项目有一个高概念。并且用户可以有很多项目。然后,当我想删除一个项目时,我会收到以下错误消息:

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

SQLSTATE[23000]:完整性约束违规:1451 无法删除或更新父行:外键约束失败(writtle.personnages,约束FK_286738A6C18272外键(projet_id)参考projets (id))

这是我的实体:

人物实体

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

项目实体

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

我不知道我怎么能把它联系起来,我尝试了一些类似JoinColumnondeletecascade... 我看到了一些主题,但我认为我正确地使用了它。

【问题讨论】:

  • 在删除项目时,是否要同时删除所有相关实体?
  • 感谢您的回答,是的,如果用户点击删除,则必须删除所有相关实体

标签: symfony


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢!我必须在项目的每个子项上添加它吗?
  • 就在project 一侧,因为它是关系的所有者。
猜你喜欢
  • 2019-07-09
  • 2018-04-13
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
相关资源
最近更新 更多