2012-03-26 12 views
14

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 
{ 
} 
+0

Haben Sie in der Zwischenzeit irgendwelche Lösungen gefunden? – Trix

Antwort

3

Nach dem Doctrine manual on Inheritance Mapping Lesen seiner sagt:

Das bedeutet, dass One-To-Many Verbände auf einem zugeordneten übergeordneten Klasse auf allen Es könnte sich lohnen

nicht möglich sind Blick auf die Tabelle Vererbungsmerkmale.

+3

Ich habe diesen Teil auch gelesen. Deshalb habe ich eine ManyToOne-Assoziation gemacht: "persistente Beziehungen, die durch eine zugeordnete Superklasse definiert sind, müssen unidirektional sein (nur mit einer eigenen Seite)" – Emilie