2011-09-04 111 views
3

我和我的一位朋友正在研究一種用於存儲食譜的多語言網絡應用程序。我們使用Doctrine 2.1.1進行持久化。目前,我堅持爲實體創建模型,並希望有人能給我一個提示,或者爲我們的案例展示最佳實踐。Doctrine2:具有多個外鍵的表格的關聯映射

我會試着廣泛地解釋我們的ERD。隨意問,如果有什麼不明白的。我們的應用程序有實體recipe,ingredients,units(成分的測量單位)和categories。每個實體都存儲在自己的表中。每個實體可以用多種語言翻譯。存儲翻譯的目的是在名爲(你的名字)translations。 現在它會有點棘手...我們有一個額外的表,稱爲mnemonic。我們用它來在全球範圍內識別食譜,成分,類別和計量單位......我認爲最好的類比是GUID。助記符還有助於我們在食譜,配料等及其翻譯之間進行映射。 助記表由五行組成:id(主鍵)和四個附加元數據行:ingredient_idrecipe_id,category_idunit_id引用與其親屬的主鍵的1:1關係。

我在問自己,我是如何映射助記符實體和食譜,​​配料等之間的關係的。 或者(更具體地說)助記表中的category_id如何自動填充類別表的主鍵的值?

我第一次嘗試這種關聯關係映射在我的分類模型:

class Category 
{ 
/** 
* @var integer $id 
* 
* @Column(name="id", type="bigint", nullable=false) 
* @Id 
* @GeneratedValue(strategy="IDENTITY") 
* @OneToOne(targetEntity="Mnemonic", mappedBy="category") 
* @JoinColumn(name="id", referencedColumnName="category_id") 
*/ 
private $id; 

,並在助記符模式:

class Mnemonic 
{ 
/** 
* 
* @OneToOne(targetEntity="Category", inversedBy="mnemonic") 
* @JoinColumn(name="category_id", referencedColumnName="id") 
*/  
private $categoryId; 

那沒有發揮出來 - 主義「不產生任何錯誤,但只填充類別表。 所以我想我可以在類別模型的__construct方法中編寫一些代碼,在那裏我將創建一個助記符對象,根據類別模型的ID設置他的categoryId並將其綁定到教義的實體管理器。但是這有點醜 - 我認爲模型類不應該爲持久性負責。 在寫我的問題時,我想,解決方案可能是一種工廠類。它會將模型中的所有持久性邏輯拿出來,並且可以處理特殊情況。

您認爲如何?什麼是最好的解決方案?

在建議最好的問候

保羅

回答