2012-06-12 39 views
3

之間通用的聯繫我與Symfony2中/ Doctrine2建模問題。我目前正在從以前的PHP框架Symfony2的消磨整個網站,並有前框架,我喜歡,但我不能管理與Symfony和學說來模型化的構想。的Symfony2/Doctrine2:有對象

這裏是我的問題:與前框架,有可能A類的一個對象鏈接到任何其他類(B,C,d ...)的任何其他目的。要做到這一點,則A類具有屬性MODEL_ID知道哪個類的對象鏈接到(其對應於每一類的配置文件中定義的唯一ID),屬性RECORD_ID其是連接對象的外部ID 。通過這種方式,例如,它可能有一個類註釋,並有任何對象(博客帖子,用戶等)的註釋。因爲這些通用鏈接似乎不可能用Doctrine關係(ManyToOne等)進行建模,所以我想 - 就像在前一個框架中那樣 - 一種全局方法或每個類的方法,例如getItem,它查看屬性model_id和record_id,然後返回正確的對象。

但我再次遇到了問題:

  • 我不能在實體直接,因爲我不應該在實體類訪問數據庫定義這個方法。

  • 如果我在一個全球性的服務一旦定義它,或N次在資源庫中每類 - 這是可能的,因爲這時候我已經對數據庫的訪問 - 我就可以到處但在調用該方法實體代碼。它使得實現非常醜陋,因爲這意味着在我之前的例子中,需要訪問評論的實體的所有方法必須從實體移動到存儲庫。最後,我將在倉庫中擁有幾乎所有的對象方法,而不是直接在實體中。

你有,我怎麼能有這樣的系統,該系統允許一般而言的對象鏈接到任何其他對象,然後恢復輕鬆鏈接的對象,就像它是一個「平常」學說關係的任何想法?

非常感謝您的幫助。

回答

2

事情是你的解決方案意味着我們事先知道對象A將被鏈接到一個對象B,C等等。但是,我想實現的是一個我們不知道的解決方案什麼是鏈接,我們有可能在對象A和新創建的類Z的對象之間創建一個新鏈接,而不會改變類A和Z中的任何內容。這樣,如果我以前面的示例爲例,你可以正確地評論任何對象,而不需要在類Comment和其他類之間建立直接的關係。

我想我找到了解決這個問題:

我所做的是實施監聽,與事件餐後每個實體從原則加載時觸發。另一方面,我的實體例如有一個屬性$ item,它是我們還不知道該類的鏈接項目。 在postLoad事件中,我們查看數據庫感謝model_id和record_id什麼是鏈接項目的類,並返回對象本身,然後在實體由Doctrine返回之前填充$ item屬性。這樣,每當我們從Doctrine獲得實體時,實體和項目之間的「假」鏈接就由自動事件構建,並且這適用於每個實體。 基於同樣的原理,我們可以用每次更新實體時會觸發的postUpdate事件更新鏈接。它會手動更新數據庫中的「假」鏈接。

欲瞭解更多信息,我建議閱讀這些網頁:

0

我已經實施了類似的情況是相當容易的事情的方式,雖然不完全是直截了當:

您可以創建一個新的類,我會提出類似的名稱:

CommentTopicRegistry

在你將使你鏈接到其他對象:

class_a_id
class_b_id
class_c_id

這可以讓你將其與多個其他的關聯。您一次只能使用其中一個遠程ID,但它可以讓您跨對象使用它,並利用ORM。

如果你想沒有太在乎初始對象 - > comment_thread設置,那麼我會建議或許只是:

foreign_id
foreign_class

有意義嗎?