Doctrine不会在映射的超类之间创建多对一关联的外键吗?

时间:2013-08-17 07:56:12

标签: symfony orm doctrine-orm foreign-keys symfony-2.1

我有两个映射的超类AbstractItemAbstractTemplate,具有多对一的单向关联:

Me\Core\Entity\AbstractItem:
  type: mappedSuperclass
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  manyToOne:
    template:
      targetEntity: AbstractTemplate

Me\Core\Entity\AbstractTemplate:
  type: mappedSuperclass
  id:
    id:
      type: integer
      generator: { strategy: AUTO }

实际分类SectionTemplate扩展了它们的抽象对应物。当我转储SQL(php app/console doctrine:schema:update --dump-sql --complete)时,我得到:

CREATE TABLE section (
    id INT AUTO_INCREMENT NOT NULL,
    position SMALLINT NOT NULL,
    template_id INT DEFAULT NULL,
    INDEX IDX_2D737AEF5DA0FB8 (template_id),
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

CREATE TABLE template (
    id INT AUTO_INCREMENT NOT NULL,
    path VARCHAR(255) NOT NULL,
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB

...并且未创建外键section.template_idtemplate.id。任何的想法?我正在使用Doctrine 2.3。*。

2 个答案:

答案 0 :(得分:1)

不会按照你想要的方式发生。
从这里开始:http://docs.doctrine-project.org/en/latest/reference/inheritance-mapping.html

映射的超类不能是实体,它不是可查询的,并且由映射的超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着一对多>根本不可能在映射的超类上进行关联。此外,只有当映射的超类目前仅在一个实体中使用时,才能实现多对多关联。为了进一步支持继承,必须使用单个或连接表继承功能。

Doctrine只会映射实体。 AbstractEntities实际上并不存在,因此无需映射。我很惊讶你甚至可以从你所吃的东西中获得temple_id。

您需要在section.yml和template.yml文件中建立关系。

是的,如果你从抽象类派生其他实体,那么你也需要在它们上添加关系。

============================================

更新:评论的更多信息。

您可以定义抽象类和实际实体类之间的关联。在你的yaml文件中使用Template而不是AbstractTemplate。从抽象类派生的任何实体都将继承该关系,但它始终指向Template实体。

所以你可以拥有

section manyToOne Template Page manyToOne模板

其中Section和Page都扩展了AbstractItem

当您尝试指向AbstractTemplate时,系统不知道实际派生的AbstractTemplate类指向哪个。可能有十几个派生类。

因此,如果您希望任何AbstractItem派生实体能够指向任何AbstractTemplate派生类,那么您需要在派生的AbstractItem实体中定义关系。

希望回答这个问题。

等一下。现在我理解你的困惑。您在表中有一个template_id,因为您命名了关系模板。我希望和错误是在doctrine:schema:update期间生成的,因为指向不是实体的AbstractTemplate。可能是学说中的一个错误。

============================================== < / p>

更新#2

带着狗散步,想出你实际想要完成的是什么。

我猜你想要将一些sectionItems链接到一种模板(称之为TemplateType1)和其他sectionItems链接到不同类型的模板(称之为TemplateType2)?

如果确实如此,那么您希望为模板使用表继承。您的AbstractItem.template.targetEntity将是BaseTeamplate而不是AbstractTemplate。

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

如果这不是您想要做的,那么请考虑更新您的问题并添加您真正想要实现的目标。

答案 1 :(得分:0)

所以你真的没有在这里用多对一的关系指定任何东西。

试试这个:

Me\Core\Entity\AbstractItem:
  type: mappedSuperclass
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  manyToOne:
    template:
      targetEntity: AbstractTemplate
      joinColumn: 
         name: Ab_template #dont want to create a naming issue
         referencedColumnName: id

让我知道之后会发生什么。请记得运行schema:update