我正在尝试使用Symfony
和Doctrine
构建非常基本的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
遍历我的实体图并从下至上删除所有内容,在这里应该做些什么。
级联从本质上讲是一个瀑布,从某种意义上说,它决定了操作将流向下一个位置。
Cascade persist
的意思是:当该条目保留下来时,让操作也向下流到与此条目相关的子实体。其他操作也以类似方式工作。
在您的情况下,级联似乎是从子实体开始的。致电时:
$entityManager->remove($section);
实体管理器仅注意到page
的级联操作,而不注意entries
的级联操作。
当您将级联操作放到Section
的$entries
上时,出于类似的原因,您可能最终会因级联删除而删除您的页面。