0

我有两个映射的超类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.*。

4

2 回答 2

1

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

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

Doctrine 只会映射实体。AbstractEntities 实际上并不存在,所以没有什么可以映射的。我很惊讶您甚至能够从您最常用的内容中获得 Temple_id。

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

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

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

更新:评论的更多信息。

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

所以你可以有

部分 manyToOne 模板页面 manyToOne 模板

Section 和 Page 都扩展 AbstractItem

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

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

希望能回答这个问题。

等一等。现在我明白你的困惑了。您的表中有一个 template_id,因为您命名了关系模板。由于指向不是实体的 AbstractTemplate,我会期望在教义:架构:更新期间产生错误。可能是教义上的错误。

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

更新#2

带着狗去散步,然后猜测你实际上想要完成什么。

我猜您希望您的一些sectionItems 链接到一种类型的模板(称为TemplateType1)和其他sectionItems 链接到不同类型的模板(称为TemplateType2)?

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

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

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

于 2013-08-17T17:17:39.173 回答
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

于 2013-08-17T09:39:24.740 回答