我的头衔可能不是最好的描述,但我最好能想出来。
我有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。
这可能吗?如果可以,怎么做?
答案 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: { }