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

问题描述 投票:0回答:1

我正在尝试使用SymfonyDoctrine构建非常基本的CMS。我有类似网站结构的实体,如下所示:

[实体:页面

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

    /**
     * Owning side of relation
     * @ORM\OneToMany(targetEntity="App\Entity\ContentTypes\Content", mappedBy="entry", fetch="EAGER")
     */
    private $contents;


    public function __construct()
    {
    ...

因此,最后Page可以具有Sections,而后者可以具有Entries,依此类推。现在,从我从docs那里收集的数据来看,我假设我可以通过设置cascades的方式去使用EntityManager来删除任何实体的实例(让我们说Section),然后它将自动删除该实例以及所有包含的Entries

但是,当我执行类似操作时:

$section = $this->getSectionByID($sectionid);

$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($section);
$entityManager->flush();

Section一旦有Entries,我得到:

An exception occurred while executing 'DELETE FROM section WHERE id = ?' with params [10]:

SQLSTATE[23000]: Integrity constraint violation: 
1451 Cannot delete or update a parent row: 
a foreign key constraint fails (`webdata`.`entry`, CONSTRAINT `FK_2B219D70D823E37A` 
FOREIGN KEY (`section_id`) REFERENCES `section` (`id`))

我知道这是什么意思,但我只是想不出要强制EntityManager遍历我的实体图并从下至上删除所有内容,在这里应该做些什么。

php symfony doctrine symfony4 cascade
1个回答
0
投票

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

Cascade persist的意思是:当该条目保留下来时,让操作也向下流到与此条目相关的子实体。其他操作也以类似方式工作。

在您的情况下,级联似乎是从子实体开始的。致电时:

$entityManager->remove($section);

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

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

© www.soinside.com 2019 - 2024. All rights reserved.