2012-06-21 34 views
1

我正在使用Symfony2和Doctrine 2.0。我試圖從XML Feed中讀取數據並將其映射到數據庫中的新實體或現有實體。當XML Feed中的數據發生變化時,我需要更新現有實體,但是當添加數據時,我應該創建新的實體。Symfony2將XML數據非規範化爲與關係相關的主體實體

在我的實體類,我用下面去正規化方法將XML數據映射到實體的屬性:

function denormalize(SerializerInterface $serializer, $data, $format = null) 

(在Symfony的\分量\串行\叫我的實體類內部串行定義)

該方法的文檔聲明:「理解denormalize()調用應遞歸化實現器的所有子對象是非常重要的。」這就是我想要做的。然而,實體不應該知道EntityManager,因此如何在denormalize()方法內檢查相關/子實體是否已經存在或不存在?

親切的問候, 馬修

回答

0

我認爲我的問題是在我的方法,而不是我的代碼!

最初,每次我發現一個實體在XML中表示時,我會檢查(使用EntityManager),看看它是否是新的或現有的非正常化之前。我採用這條路線是因爲XML中存在重複,我擔心在EntityManager中創建重複的實體。對實體已經存在是否存在意味着我可以更新現有實體而不是創建重複實體。現在用我的新方法,每當我找到一個在XML中表示的實體時,我都會將它變爲一個新的實體。當然這會在EntityManager中造成重複,就像在XML中一樣,但是可以稍後處理,希望..!

到目前爲止,這被證明是一個更好的解決方案,雖然我在使用$ em-> merge()試圖合併EntityManager中的重複實體時遇到了一些問題。和級聯= {「堅持」,「合併」}。我已經張貼了關於這個在這裏一個新的問題:Doctrine 2.1 - Relation Lost After ManyToMany Cascade Merge - Symfony2

馬修

0

這確實是一個壞主意,調用EntityManager的一個實體(和,據我所知,外面控制器)。

我從來沒有遇到過這個問題,但是如果我是你,我會嘗試在你的一個控制器中進行非規範化,或者如果它真的困擾你,在一個你在控制器中調用的服務中,給你的EntityManager(這裏再次說明,最好是在控制器本身,或者只是發送你的對象到服務,以便它可以將xml「正常化」到對象中)。

最好的辦法是編寫一個控制器,無論給定的實體如何工作。

希望有幫助!

+0

由於加布裏埃爾,其實我在反規範化控制檯命令的實體,但我在這種情況下猜命令或控制器不會使很大的差異。我認爲這個問題實際上是我過早做了太多事情,現在我決定採取一種新方法。我會在下面更詳細地解釋。請讓我知道你的想法 :) – mattvick