2

我最初在这里发布了这个问题:https ://github.com/doctrine/DoctrineBundle/issues/297

我有以下实体层次结构,MyProduct是通过类表继承映射的父实体:

SyliusProduct    # Mapped superclass containing the 'options' association mapping
–- MyProduct     # Mapped superclass that should override the association (Head of CTI)
---- MyProduct1  # Ultimate children (entities)
---- MyProduct2
---- MyProduct3
---- MyProduct4

SyliusProduct与Option实体具有多对多关联,该实体在SyliusProduct的映射中映射。

我无法更改SyliusProduct的映射(它是 Symfony 供应商的一部分)。

生成模式时,教义希望为每个最终子级生成sylius_product_options表,这会引发“表存在”异常。

有没有办法:

  • 通过创建 4 个不同的表(并指定不同的表名)来映射最终子级的关联?
  • 将其映射到MyProduct级别?
  • 干脆无视关联?
4

1 回答 1

0

这个问题很老,但是您应该将产品实体继承类型设置为单表(不要设置子实体的表属性,否则您会收到错误说表已存在)

您还需要为每个子产品的 MyProduct 实体添加一个鉴别器映射,如下所示:

<entity name="MyProduct" inheritance-type="SINGLE_TABLE">
    <discriminator-map>
        <discriminator-mapping value="pr1" class="MyProduct1"/>
        <discriminator-mapping value="pr2" class="MyProduct2"/>
        <discriminator-mapping value="pr2" class="MyProduct3"/>
    </discriminator-map>
    ...
</entity>

如果父映射超类已经具有多对多选项映射,则不必在 MyProduct 实体中重新定义它。

这样,MyProduct1-4 实体将继承自 MyProduct,而 MyProduct 本身继承自 SyliusProduct,所有这些都在 SINGLE_TABLE 上,因此学说不会尝试为每个子产品创建具有相同名称的不同表。

于 2017-06-24T09:09:32.403 回答