私は非常に基本的なCMSを使用して構築しようとしていますSymfony
と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;
/**
* Owning side of relation
* @ORM\OneToMany(targetEntity="App\Entity\ContentTypes\Content", mappedBy="entry", fetch="EAGER")
*/
private $contents;
public function __construct()
{
...
だから、端部AにPage
持つことができますSections
することができたEntries
などと。今、私はから収集するものからドキュメント私はどのように私のセットアップと仮定していた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
私のエンティティグラフと下から上へ、削除、すべてをダウントラバースします。
ためにはことが判明したDoctrine
カスケード接続するにはremove
、単にそのように所有している側に注釈を付けるだろうエンティティ関係グラフ1ダウン:
/**
* Owning side of relation
* @ORM\OneToMany(targetEntity="Page", mappedBy="website", cascade={"all"}, fetch="EAGER")
*/
private $pages;
これは、しかし、本当にちょうどあなたが例えば中に起こるしたいものORMを伝えますremove
。これは、データベースへの実際の呼び出し中に何が起こるかをモデル化するために十分ではありません。このために、一つは、追加を追加する必要があります@ORM\JoinColumn(onDelete="CASCADE")
ので、同じように、逆サイドへ:
/**
* @ORM\ManyToOne(targetEntity="Website", inversedBy="pages", fetch="EAGER")
* @ORM\JoinColumn(onDelete="CASCADE")
*/
private $website;
意図したとおりに、このすべての作品では。私はまた、手動経由エントリ削除して最終的にはできる午前phpMyAdmin
も前に私にエラーを与えたが。