在我的供應商包中,我有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
{
}
您是否在此期間找到了解決方案? – Trix 2017-10-07 19:38:47