我有两个映射的超类AbstractItem
和AbstractTemplate
,具有多对一的单向关联:
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 }
实际分类Section
和Template
扩展了它们的抽象对应物。当我转储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_id
到template.id
。任何的想法?我正在使用Doctrine 2.3。*。
答案 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
!