2012-03-26 19 views
14

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

Czy znalazłeś jakieś rozwiązania tego w międzyczasie? – Trix

Odpowiedz

3

Po przeczytaniu Doctrine manual on Inheritance Mapping jej mówi:

Oznacza to, że jeden-do-wielu stowarzyszenia nie są możliwe na mapowanym nadklasie wcale

Może warto patrząc na funkcje dziedziczenia tabeli.

+3

Czytałem także tę część. Właśnie dlatego stworzyłem powiązanie ManyToOne: "trwałe relacje zdefiniowane przez zmapowaną nadklasę muszą być jednokierunkowe (tylko z właścicielem)" – Emilie

Powiązane problemy