2012-03-26 131 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