簡體   English   中英

學說2 - 從抽象類到抽象類

[英]Doctrine 2 - Relate from abstract class to abstract class

好的。 這個問題很難描述。 但是這里。 我會先發布一些圖片,只是讓某人從這張圖片中得到我正在做的事情;

在此輸入圖像描述

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

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

我希望能夠從頁面,帖子或表單中與Content-或FormBlocks相關聯。

我怎樣才能在學說中實現這一目標?

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

並非每個ContentEntity都有Blocks。 所以我不能將它添加為ContentEntity的屬性。

現在。 我當然可以使用ManyToMany關系並使用JoinTable。 我想這總是有效的。 但我必須加入兩次。

我認為您的問題主要不是關於數據關系,而是關於您希望避免重復代碼的事實。 這導致您的“實體”位於層次結構的頂部,只是因為它具有每個實體應具有的一些共同屬性。 (順便說一句,命名實體“實體”有點令人困惑。)

也許你正在尋找的是特質 因此,它不是通過實體提供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我猜),這更合乎邏輯。

還有一篇很好的文章詳細闡述了如何使用Doctrine進行進一步閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM