亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

原則:一對多級聯中的異常:違反完整性約束 1451

原則:一對多級聯中的異常:違反完整性約束 1451

PHP
眼眸繁星 2022-10-22 15:08:08
我正在嘗試使用Symfonyand構建一個非?;镜?CMS 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;所以最后一個Page可以擁有Sections哪個可以擁有Entries等等?,F在,根據我從文檔中收集到的內容,我假設通過我的設置方式,cascades我可以去使用EntityManager刪除任何實體的實例(比如說Section),它會自動刪除該實例以及所有包含的實例Entries.
查看完整描述

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;

順便說一句,您確定要始終急切地獲取所有東西嗎?


查看完整回答
反對 回復 2022-10-22
?
不負相思意

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之前也給我錯誤的條目。


查看完整回答
反對 回復 2022-10-22
  • 2 回答
  • 0 關注
  • 158 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號