2 回答

TA貢獻1799條經驗 獲得超9個贊
級聯本質上是一個瀑布,從某種意義上說,它決定了操作將流向下一步。
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;
順便說一句,您確定要始終急切地獲取所有東西嗎?

TA貢獻1777條經驗 獲得超10個贊
事實證明,為了將實體關系圖向下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之前也給我錯誤的條目。
- 2 回答
- 0 關注
- 158 瀏覽
添加回答
舉報