In meinem Lieferantenbündel habe ich 2 zugeordnete Superklassen: BaseSite und BaseSection (die abstrakt sind).Assoziationsmapping mit gemappter Superklasse
In meinem Anwendungsbündel habe ich 2 Entitäten, die die 2 zugeordnete Superklasse erweitern. Alles funktioniert so weit: Ich habe Zugriff auf die in den Oberklassen definierten Felder und kann bei Bedarf neue in meinem Anwendungs-Bundle hinzufügen.
Das Problem ist, wenn ich versuche, meine Zuordnungszuordnung zwischen diesen Entitäten zu definieren. (manyToOne zwischen BaseSection und BaseSite). Wenn ich es in den BaseSection abgebildet geordneten Klasse definieren, kann ich den Befehl app/console doctrine:generate:entities AcmeDemoBundle
, laufen, aber es funktioniert nicht, wenn ich versuche, um die Tabellen zu erstellen: (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
Wie Sie sehen können, Es versucht, den Fremdschlüssel auf einer Tabelle zu referenzieren, die nicht existiert (BaseSite statt Site). Ich vermute, das liegt daran, dass die zugeordnete Oberklasse den in der Anwendungseinheit definierten Tabellennamen nicht kennt.
Ich könnte stattdessen die Zuordnungszuordnung für die Anwendungsentitäten definieren, aber das würde bedeuten, dass, wenn jemand mein Bündel verwenden möchte, er die Zuordnung selbst definieren müsste, was ich vermeiden möchte.
Gibt es eine andere Möglichkeit, dies zu tun, oder vielleicht fehlt mir gerade etwas?
Hier ist mein Code:
Lieferant:
Datei: Anbieter \ Bündel \ Acme \ DemoBundle \ Resources \ config \ Lehre \ 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
// ...
Datei: Hersteller \ Bundles \ Acme \ DemoBundle \ Ressourcen \ Konfig \ Doktrin \ 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
Anwendung:
Datei: src \ Application \ Acme \ DemoBundle \ Resources \ config \ Lehre \ Site.orm.yml
Application\Acme\DemoBundle\Entity\Site:
type: entity
table: Site
Datei: src \ Anwendungs \ Acme \ DemoBundle \ Entität \ Site.php
<?php
namespace Application\Acme\DemoBundle\Entity;
use Acme\DemoBundle\Entity\BaseSite;
class Site extends BaseSite
{
}
Datei: src \ Application \ Acme \ DemoBundle \ Resources \ config \ Lehre \ Section.orm.yml
Application\Acme\DemoBundle\Entity\Section:
type: entity
table: Section
Datei: src \ Application \ Acme \ DemoBundle \ Entity \ Section.php
<?php
namespace Application\Acme\DemoBundle\Entity;
use Acme\DemoBundle\Entity\BaseSection;
class Section extends BaseSection
{
}
Haben Sie in der Zwischenzeit irgendwelche Lösungen gefunden? – Trix