2012-12-27 86 views
1

考慮與0..n兒童的父。當我從父項中移除一個子項並堅持父項對象時,我需要刪除子項。目前,我得到了工作的唯一方法是實際刪除兒童,以及像這樣的:Symfony2主義級聯刪除子關係

$parent->removeChild($child); 
$em->remove($child); 

我想我的關係是建立正確的,因爲如果我刪除家長完全是孩子的正在從刪除分貝也。爲什麼不是下面一行足夠去除孩子?:

$parent->removeChild($child); 

一些背景信息:我想更新X子對象父對象,我需要以前關聯的孩子的被刪除,新的孩子的被添加。但我覺得我應該需要遍歷這兩個集合,以找出哪些刪除和/或添加。

有沒有人有這樣的明確例子?請忘記Symfony's/Doctrine的文檔。我讀過這一切!

+1

根據文檔,你必須這樣做,但他們建議將其封裝到一個函數中。 – jaudette

回答

2

孩子們有自己的生活,你不應該因爲他們與父母分離而擺脫他們。換個角度來說,這些是單獨的實體,並且有許多用例會斷開關係,但仍然想要維護這兩個對象,所以當我們刪除它的關係時,我們不會自動刪除一個對象。

你的直覺是對的,你需要遍歷這兩個列表。我知道你說過你讀過所有的文件,但是再看看How to Embed a Collection of Forms的結尾。它包含一個父對象的工作編輯功能,它正是這樣做的。

+0

你的解釋聽起來很公平。我提到的迭代與您指出的文檔完全相同。但是,我得到了一個Web控制器和一個REST API控制器來編輯我的Parent對象的子對象。如果你看一下文檔,這意味着我得到了4個「foreach」語句來照顧孩子的關係。有兩個獨立的控制器意味着我實際上需要8條語句來更新孩子。我覺得這可以用更簡單,更簡單的方式來完成? – symfoon

+0

就不重複而言,php並不真正具有您需要更直接處理這種數據結構的類型(如Python代碼)。你可能可以設計一些更高效的工具,但除非你處理大型陣列,否則這不應該成爲一個大問題。至於代碼效率,你是對的,這是不必要的重複。正如@jaudette建議的那樣,我會將整個過程封裝在一個函數中,可能是在實體的教義類中。那麼你可以簡單地調用$ object-> editChildren($ array)並將所有的邏輯保存在一個地方。 – MrGlass

+0

好吧,我會將這一個標記爲已回答。感謝您的輸入! – symfoon

1

如果你有沒有父母和父母私人擁有的孩子不應該存在的子實體,那麼你可以使用orphanRemoval。

/** 
* @OneToOne(targetEntity="StandingData", orphanRemoval=true) 
*/ 
private $standingData; 

$contact->standingData(new StandingData("Firstname", "Lastname", "Street")); 

如果聯繫人有一箇舊的「standingData」,它將從數據庫中刪除。 有關更多信息,請參閱http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#orphan-removal