2012-03-26 14 views
14

Nel mio gruppo di fornitori, ho 2 superclasse mappate: BaseSite e BaseSection (che sono astratte).Associazione associazione con superclasse mappata

Nel pacchetto di applicazioni, ho 2 entità che estendono la superclasse mappata 2. Tutto funziona fino ad ora: ho accesso ai campi definiti nelle superclassi e posso aggiungerne di nuovi nel mio pacchetto di applicazioni, se necessario.

Il problema si verifica quando si tenta di definire la mappatura dell'associazione tra quelle entità. (manyToOne tra BaseSection e BaseSite). Se io definisco nelle BaseSection mappato superclasse, sono in grado di eseguire il comando app/console doctrine:generate:entities AcmeDemoBundle, ma non funziona quando cerco di creare le tabelle: (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 

Come si può vedere, prova a fare riferimento alla chiave esterna su una tabella che non esiste (BaseSite anziché Sito). Sto indovinando questo perché la superclasse mappata non è a conoscenza del nome della tabella definito nell'entità dell'applicazione.

Potrei definire la mappatura delle associazioni sulle entità dell'applicazione, ma ciò significherebbe che se qualcuno volesse utilizzare il mio pacchetto, avrebbe dovuto definire la mappatura da sé, cosa che vorrei evitare.

C'è un altro modo per farlo o forse mi manca qualcosa?

Ecco il mio codice:

Venditore:

File: vendor \ fasci \ Acme \ DemoBundle \ Resources \ config \ dottrina \ 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 
    // ... 

File: 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 

Applicazione:

File: src \ Application \ Acme \ DemoBundle \ Resources \ config \ dottrina \ Site.orm.yml

Application\Acme\DemoBundle\Entity\Site: 
    type: entity 
    table: Site 

File: src \ Application \ Acme \ DemoBundle \ Entity \ Site.php

<?php 

namespace Application\Acme\DemoBundle\Entity; 

use Acme\DemoBundle\Entity\BaseSite; 

class Site extends BaseSite 
{ 
} 

file: src \ Application \ Acme \ DemoBundle \ Resources \ config \ dottrina \ Section.orm.yml

Application\Acme\DemoBundle\Entity\Section: 
    type: entity 
    table: Section 

file: src \ Application \ Acme \ DemoBundle \ Entity \ section.php

<?php 

namespace Application\Acme\DemoBundle\Entity; 

use Acme\DemoBundle\Entity\BaseSection; 

class Section extends BaseSection 
{ 
} 
+0

Avete trovato soluzioni nel frattempo? – Trix

risposta

3

Dopo aver letto il Doctrine manual on Inheritance Mapping sua dice:

Ciò significa che le associazioni uno-a-molti non sono possibili su una superclasse mappata affatto

Potrebbe valere la pena guardando le caratteristiche di ereditarietà della tabella.

+3

Ho letto anche quella parte. Ecco perché ho creato un'associazione ManyToOne: "le relazioni persistenti definite da una superclasse mappata devono essere unidirezionali (con una sola parte proprietaria)" – Emilie