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
{
}
Avete trovato soluzioni nel frattempo? – Trix