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

我正在尝试使用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.


眼眸繁星
浏览 120回答 2
2回答

扬帆大鱼

级联本质上是一个瀑布,从某种意义上说,它决定了操作将流向下一步。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;顺便说一句,您确定要始终急切地获取所有东西吗?

不负相思意

事实证明,为了将实体关系图向下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之前也给我错误的条目。
打开App,查看更多内容
随时随地看视频慕课网APP