2013-08-17 42 views
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 } 

实际classses 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。*。

回答

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

+0

仍然无法使用。根据文档,joinColumn配置不是强制性的。 – gremo

0

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

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

学说只是要去映射实体。抽象实际上并不存在,所以没有任何东西可以映射。我很惊讶,你甚至能够从你所羁绊的东西中得到temple_id。

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

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

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

更新:更多信息的评论。

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

所以你可以有

科多对一模板 页多对一模板

那里当您尝试指向一个AbstractTemplate系统两科和页面扩展AbstractItem

不知道哪些实际导出AbstractTemplate类指向。可能有十几个派生类。

所以,如果你想要任何AbstractItem派生实体能够指向任何AbstractTemplate派生类,那么你将需要定义派生AbstractItem实体中的关系。

希望能回答这个问题。

等一下。现在我明白你的困惑。因为您命名了关系模板,所以表中有一个template_id。由于指向不是实体的AbstractTemplate,因此我希望在doctrine:schema:update期间生成错误。可能是教条中的一个错误。

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

更新#2

接过狗散步和带猜上来,什么是你实际上是试图完成。

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

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

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

如果这不是你想干什么,然后考虑更新你的问题和增加你真的想实现什么。

+0

所以多对一是一个允许的关联。如果没有创建外键,让我在映射超类中定义此关联有什么意义?定义'manyToOne'来创建'template_id'与将'template_id'定义为一个常规字段完全一样......对这一点感到困惑。 – gremo