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;
顺便说一句,您确定要始终急切地获取所有东西吗?
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之前也给我错误的条目。
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报