2012-03-26 134 views
14

在我的供应商包中,我有2个映射的超类:BaseSite和BaseSection(它们是抽象的)。映射超类的关联映射

在我的应用程序包中,我有2个实体扩展了2映射的超类。 到目前为止一切正常:我可以访问超类中定义的字段,如果需要,我可以在应用程序捆绑中添加新字段。

问题是当我试图定义这些实体之间的关联映射时。 (在BaseSection和BaseSite之间的manyToOne)。 如果我在BaseSection映射超类定义它,我能够运行命令app/console doctrine:generate:entities AcmeDemoBundle,但是当 我尝试创建表它不工作:(app/console doctrine:schema:update --dump-sql

CREATE TABLE Section (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, siteId INT DEFAULT NULL, INDEX IDX_95E06DEFFADB670C (siteId), PRIMARY KEY(id)) ENGINE = InnoDB; 
CREATE TABLE Site (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB; 
ALTER TABLE Section ADD CONSTRAINT FK_95E06DEFFADB670C FOREIGN KEY (siteId) REFERENCES BaseSite(id) ON DELETE CASCADE 

正如你所看到的,它会尝试在不存在的表上引用外键(BaseSite而不是Site)。我猜这是因为映射的超类不知道应用程序实体中定义的表名。

我可以在应用程序实体上定义关联映射,但这意味着如果有人想使用我的包,他必须自己定义映射,我想避免这种情况。

有没有另一种方法来做到这一点,或者我只是想念一些东西?

这里是我的代码:

卖方:

文件:供应商\ \包Acme的\ DemoBundle \资源\ CONFIG \原则\ BaseSite.orm.yml

Acme\DemoBundle\Entity\BaseSite: 
    type: mappedSuperclass 
    fields: 
    id: 
     type: integer 
     id: true 
     generator: 
     strategy: AUTO 
    name: 
     type: string 
     length: 255 
     nullable: false 
    // ... 

文件:vendor \ bundles \ Acme \ DemoBundle \ Resources \ config \ doctrine \ BaseSection.orm.yml

Acme\DemoBundle\Entity\BaseSection: 
    type: mappedSuperclass 
    fields: 
    id: 
     type: integer 
     id: true 
     generator: 
     strategy: AUTO 
    name: 
     type: string 
     length: 255 
     nullable: false 
    // ... 
    manyToOne: 
    site: 
     targetEntity: Acme\DemoBundle\Entity\BaseSite 
     joinColumn: 
     name: siteId 
     referencedColumnName: id 
     onDelete: cascade 

应用:

文件:的src \应用\ Acme的\ DemoBundle \资源\ CONFIG \原则\ Site.orm.yml

Application\Acme\DemoBundle\Entity\Site: 
    type: entity 
    table: Site 

文件:SRC \应用\ Acme \ DemoBundle \ Entity \ Site.php

<?php 

namespace Application\Acme\DemoBundle\Entity; 

use Acme\DemoBundle\Entity\BaseSite; 

class Site extends BaseSite 
{ 
} 

文件:的src \应用\ Acme的\ DemoBundle \资源\ CONFIG \原则\ Section.orm.yml

Application\Acme\DemoBundle\Entity\Section: 
    type: entity 
    table: Section 

文件:的src \应用\ Acme的\ DemoBundle \实体\科。PHP

<?php 

namespace Application\Acme\DemoBundle\Entity; 

use Acme\DemoBundle\Entity\BaseSection; 

class Section extends BaseSection 
{ 
} 
+0

您是否在此期间找到了解决方案? – Trix 2017-10-07 19:38:47

回答

3

阅读Doctrine manual on Inheritance Mapping后它说:

这意味着一个一对多的关联是不可能的映射超在所有

这可能是值得看着表继承功能。

+3

我也读过那部分。这就是为什么我做了一个ManyToOne关联:“由映射超类定义的持久关系必须是单向的(仅拥有一个拥有的一面)” – Emilie 2012-03-27 11:59:19