在我的供应商包中,我有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)。我猜这是因为映射的超类不知道应用程序实体中定义的表名。
我可以在应用程序实体上定义关联映射,但这意味着如果有人想要使用我的包,他将不得不自己定义映射,我想避免。
还有另一种方法可以做到这一点,或者我可能只是错过了什么?
这是我的代码:
供应商:
文件: vendor \ bundles \ Acme \ DemoBundle \ Resources \ config \ doctrine \ 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 \ Application \ Acme \ DemoBundle \ Resources \ config \ doctrine \ Site.orm.yml
Application\Acme\DemoBundle\Entity\Site:
type: entity
table: Site
文件: src \ Application \ Acme \ DemoBundle \ Entity \ Site.php
<?php
namespace Application\Acme\DemoBundle\Entity;
use Acme\DemoBundle\Entity\BaseSite;
class Site extends BaseSite
{
}
文件: src \ Application \ Acme \ DemoBundle \ Resources \ config \ doctrine \ Section.orm.yml
Application\Acme\DemoBundle\Entity\Section:
type: entity
table: Section
文件: src \ Application \ Acme \ DemoBundle \ Entity \ Section.php
<?php
namespace Application\Acme\DemoBundle\Entity;
use Acme\DemoBundle\Entity\BaseSection;
class Section extends BaseSection
{
}
答案 0 :(得分:4)