Mam w swojej grupie dostawców 2 zmapowane nadklasy: BaseSite i BaseSection (które są abstrakcyjne).Mapowanie skojarzenia z mapowaną nadklasą
W moim pakiecie aplikacji mam 2 jednostki, które rozszerzają 2 nadpisaną superklasę. Wszystko działa do tej pory: mam dostęp do pól zdefiniowanych w nadklasach i mogę dodać nowe w moim pakiecie aplikacji, jeśli to konieczne.
Problem polega na tym, że próbuję zdefiniować mapowanie powiązań między tymi elementami. (manyToOne między BaseSection i BaseSite). Gdybym zdefiniować go w BaseSection odwzorowane nadrzędnej, jestem w stanie uruchomić polecenie app/console doctrine:generate:entities AcmeDemoBundle
, ale to nie działa, gdy Staram się tworzyć tabele: (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
Jak widać, próbuje odwoływać się do klucza obcego w tabeli, która nie istnieje (BaseSite zamiast Site). Zgaduję, że to dlatego, że zmapowana nadklasa nie jest świadoma nazwy tabeli zdefiniowanej w jednostce aplikacji.
Mogę zdefiniować mapowanie asocjacji na elementach aplikacji, ale to oznaczałoby, że gdyby ktoś chciał użyć mojego pakietu, musiałby sam zdefiniować mapowanie, którego chciałbym uniknąć.
Czy jest inny sposób, aby to zrobić, a może po prostu czegoś brakuje?
Oto mój kod:
Vendor:
Plik: sprzedawca \ wiązki \ Acme \ DemoBundle \ Resources \ config \ doktryna \ 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
// ...
Plik: sprzedawca \ Pakiety \ Program \ Zestaw reguł \ Zasoby \ 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
Zastosowanie:
Plik: src \ Application \ Acme \ DemoBundle \ Resources \ config \ doktryna \ Site.orm.yml
Application\Acme\DemoBundle\Entity\Site:
type: entity
table: Site
Plik: src \ Application \ Acme \ DemoBundle \ Entity \ Site.php
<?php
namespace Application\Acme\DemoBundle\Entity;
use Acme\DemoBundle\Entity\BaseSite;
class Site extends BaseSite
{
}
pliku: src \ Application \ Acme \ DemoBundle \ Resources \ config \ doktryna \ Section.orm.yml
Application\Acme\DemoBundle\Entity\Section:
type: entity
table: Section
pliku: src \ Application \ Acme \ DemoBundle \ Entity \ section.php
<?php
namespace Application\Acme\DemoBundle\Entity;
use Acme\DemoBundle\Entity\BaseSection;
class Section extends BaseSection
{
}
Czy znalazłeś jakieś rozwiązania tego w międzyczasie? – Trix