2015-10-08 97 views
3

好的。這個問題很難描述。但是在這裏。我會先發布一些圖片,僅僅是讓別人從這張圖片中得到我正在做的事情;學說2 - 從抽象類到抽象類的聯繫

enter image description here

的塊是可以使用的填充網頁或博客帖子的元件。這可以是圖像,文本或表單。這些塊是ContentBlocks。 Block具有DiscriminatorColumn和DiscriminatorMap屬性,用於加入正確的Block表並創建基礎Block元素。 (即ImageContentBlock)

另一方面,我們有形式。表單由FormBlocks組成。這些是某些常見的表單元素。 (TextField,PhoneField等)。

我希望能夠與來自頁面,郵政或表單的內容或FormBlocks相關聯。

如何在教義中實現這一點?

我可以將一個entityType和entityId字段添加到Block類。但是這會消除面向對象的編程風格。我寧願參考擁有的ContentEntity。但話又說回來。我需要加入或涉及塊。

並非每個ContentEntity都有塊。所以我不能將此添加爲ContentEntity的屬性。

現在。我當然可以使用ManyToMany關係並使用JoinTable。我想這將始終有效。但我必須加入兩次。

回答

2

我認爲你的問題主要不是關於數據關係,而是關於你想避免重複代碼的事實。這會導致您的「實體」位於層次結構的頂部,這僅僅是因爲它具有每個實體應具有的幾個共同屬性。 (順便說一下,命名實體「Entity」有點令人困惑。)

也許你在找什麼是Traits。因此,而不是通過一個實體提供idactive,這可能也成爲一個特點:

trait CmsEntity 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    * @ORM\Column(type="integer") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="boolean") 
    */ 
    protected $active; 

    // add getters/setters and other code as you like 
} 

現在可以將這個特質附加到所有應該具備哪些性能給出的實體。

/** 
* @ORM\Entity 
*/ 
class Page 
{ 
    use CmsEntity; // import the trait 

    /** 
    * @ORM\Column(type="text") 
    */ 
    private $header; 

    // etc. 
} 

這將使你免於從一個只承載一些共同屬性的主「實體」派生所有實體的需求。

現在,您可以在「ContentEntity」和「Block」之間創建一個直接關係(1:n我猜),這更合乎邏輯。

還有一個nice article詳細闡述了使用與特質的學說進一步閱讀。

+0

從未想過以這種方式使用特質。感謝您指出了這一點!我想我在這裏有一個解決方案。我認爲涉及到Content或FormBlocks,我需要一個連接表。 –