为了账号安全,请及时绑定邮箱和手机立即绑定

原则:一对多级联中的异常:违反完整性约束 1451

原则:一对多级联中的异常:违反完整性约束 1451

PHP
眼眸繁星 2022-10-22 15:08:08
我正在尝试使用Symfonyand构建一个非常基本的 CMS Doctrine。我有实体模拟我的网站结构,如下所示:实体:页面/** * @ORM\Entity(repositoryClass="App\Repository\ContentTree\PageRepository") */class Page extends SortableBase{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     * @ORM\OrderBy({"sort_order" = "ASC"})     */    private $id;    /**     * @ORM\ManyToOne(targetEntity="Website", inversedBy="pages", cascade={"all"}, fetch="EAGER")     */    private $website;    /**     * Owning side of relation     * @ORM\OneToMany(targetEntity="Section", mappedBy="page", fetch="EAGER")     */    private $sections;    public function __construct()    {    ...实体:部分/** * @ORM\Entity(repositoryClass="App\Repository\ContentTree\SectionRepository") */class Section extends SortableBase{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\ManyToOne(targetEntity="Page", inversedBy="sections", cascade={"all"}, fetch="EAGER")     */    private $page;    /**     * Owning side of relation     * @ORM\OneToMany(targetEntity="Entry", mappedBy="section", fetch="EAGER")     */    private $entries;    /**     * @ORM\ManyToOne(targetEntity="App\Entity\SectionTemplating\SectionType", fetch="EAGER")     */    private $sectionType;    public function __construct()    {实体:条目/** * @ORM\Entity(repositoryClass="App\Repository\ContentTree\EntryRepository") */class Entry extends SortableBase{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\ManyToOne(targetEntity="Section", inversedBy="entries", cascade={"all"}, fetch="EAGER")     */    private $section;所以最后一个Page可以拥有Sections哪个可以拥有Entries等等。现在,根据我从文档中收集到的内容,我假设通过我的设置方式,cascades我可以去使用EntityManager删除任何实体的实例(比如说Section),它会自动删除该实例以及所有包含的实例Entries.
查看完整描述

2 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

级联本质上是一个瀑布,从某种意义上说,它决定了操作将流向下一步。


Cascade persist意思是:当这个条目被持久化时,让操作也向下流到与这个条目相关的子实体。其他操作以类似的方式工作。


在您的情况下,级联似乎是从子实体启动的。你打电话时:


$entityManager->remove($section);

实体管理器只注意到 的级联操作page,而不是entries。


当您将级联操作放在Section's$entries上时,出于类似的原因,您最终可能会得到一个删除页面的级联删除。


编辑:就注释而言,这将使:


在页面中:


/**

 * @ORM\ManyToOne(targetEntity="Website", inversedBy="pages", fetch="EAGER")

 */

private $website;


/**

 * Owning side of relation

 * @ORM\OneToMany(targetEntity="Section", mappedBy="page", fetch="EAGER" , cascade={"all"})

 */

private $sections;

在部分:


/**

 * @ORM\ManyToOne(targetEntity="Page", inversedBy="sections", fetch="EAGER")

 */

private $page;


/**

 * Owning side of relation

 * @ORM\OneToMany(targetEntity="Entry", mappedBy="section", fetch="EAGER", cascade={"all"})

 */

private $entries;

在条目中:


/**

 * @ORM\ManyToOne(targetEntity="Section", inversedBy="entries", fetch="EAGER")

 */

private $section;

顺便说一句,您确定要始终急切地获取所有东西吗?


查看完整回答
反对 回复 2022-10-22
?
不负相思意

TA贡献1777条经验 获得超10个赞

事实证明,为了将实体关系图向下Doctrine级联remove,只需像这样注释拥有方:


/**

 * Owning side of relation

 * @ORM\OneToMany(targetEntity="Page", mappedBy="website", cascade={"all"}, fetch="EAGER")

 */

private $pages;

然而,这实际上只是告诉 ORM 你想在 eg 期间发生什么remove。这不足以模拟在实际调用数据库期间会发生什么。为此,必须@ORM\JoinColumn(onDelete="CASCADE")在反面添加一个附加项,如下所示:


/**

 * @ORM\ManyToOne(targetEntity="Website", inversedBy="pages", fetch="EAGER")

 * @ORM\JoinColumn(onDelete="CASCADE")

 */

private $website;

有了这个,一切都按预期工作。我也终于能够手动删除phpMyAdmin之前也给我错误的条目。


查看完整回答
反对 回复 2022-10-22
  • 2 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信