引用id的鉴别器

时间:2015-06-28 16:47:50

标签: symfony doctrine-orm symfony-2.3

我的头衔可能不是最好的描述,但我最好能想出来。

我有4个实体; Page,PageElement,Image和一个名为TextWithImage的实体。页面包含pageElements(PageElement实体数组)。那些pageElements可以有多种类型,但是现在我只有一个名为TextWithImage的东西,它将其他数据保存到PageElement实体所拥有的数据中。

PageElement可以包含在很多页面中,因此,我在PageElement.orm.yml中有一个ManyToMany。 TextWithImage有一个manyToOne来引用Image。

(更多信息:另一个实体ImageGallery可能与Image实体有许多ToMany关系,而TextOnly不应该对Image实体有任何引用。)

我希望能够获取Page并检索具有所有“属性”的PageElements。所以,假设我要求获取一个只有一个TextWithImage类型的PageElement的页面,我想返回以下内容。

Page -> pageElements = array (
    [0] => TextWithImage -> image = Image -> filename = "image.png"
                                          -> alt = "An image!"
                         -> text  = "There's an image too!"
)

一切看起来都很简单,但我需要学说才能理解这个PageElement是一个TextWithImage类型。我可以用DiscriminatorColumn来做,比如说(草图);

Table: pageelement
id | attributes | discr | TextWithImageId

Table: textwithimage
id | attributes

请记住,我不仅仅有一种类型的PageElement,而不仅仅是TextWithImage。

这可能吗?如果可以,怎么做?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。这些是学说YML文件。您可以使用php app/console doctrine:generate:entities AppBundle/Entity生成所有实体。 确保PageTextImageElement类扩展了PageElement类。

<强> Page.orm.yml

AppBundle\Entity\Page:
    type: entity
    table: null
    repositoryClass: AppBundle\Repositories\PageRepository
    manyToMany:
        pageElements:
            targetEntity: PageElement
            cascade: ["all"]
            joinTable:
                name: null
                joinColumns:
                    page_id:
                        referencedColumnName: id
                        onDelete: CASCADE
                inverseJoinColumns:
                    page_element_id:
                        referencedColumnName: id
                        unique: true
                        onDelete: CASCADE
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:
        name:
            type: string
            length: '255'
            unique: true
    lifecycleCallbacks: {  }

<强> PageElement.orm.yml

AppBundle\Entity\PageElement:
    type: entity
    inheritanceType: SINGLE_TABLE
    discriminatorColumn:
        name: discr
        type: string
    discriminatorMap:
        pageTextImageElement: PageTextImageElement
    table: null
    repositoryClass: AppBundle\Repositories\PageElementRepository
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:
        sortOrder:
            type: integer
        attributes:
            type: array
            nullable: true
    lifecycleCallbacks: {  }

<强> PageTextImageElement.orm.yml

AppBundle\Entity\PageTextImageElement:
    type: entity
    table: null
    oneToOne:
        image:
            targetEntity: AppBundle\Entity\Image
            joinColumn:
                name: imageId
                referencedColumnName: id
    fields:
        passage:
            type: string
            length: '255'
    lifecycleCallbacks: {  }

<强> Image.orm.yml

AppBundle\Entity\Image:
    type: entity
    table: null
    repositoryClass: AppBundle\Repositories\ImageRepository
    id:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:
        name:
            type: string
            length: '255'
            unique: true
        description:
            type: string
            length: '255'
    lifecycleCallbacks: {  }