Я пытаюсь построить очень базовую c CMS, используя Symfony
и Doctrine
. У меня есть объекты, имитирующие структуру моих сайтов, например:
Entity: Page
/**
* @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()
{
...
Entity: Section
/**
* @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()
{
Сущность: Entry
/**
* @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
и так далее. Теперь, исходя из того, что я собрал из документов , я исходил из того, что при настройке cascades
я могу просто go и использовать 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
пройти через мою сущность график и удалить все снизу вверх.