2013-06-11 18 views
7

Tworzę aplikację w Symfony 2.3 z Doctrine 2.4 jako ORM. Używany silnik bazy danych to PostgreSQL. Występują problemy podczas mapowania elementów z złożonymi kluczami podstawowymi w innych tabelach. Te klawisze są obcymi klawiszami w odpowiednim kluczu.Symfony2 Doctrine ORM Composite Primary Keys

tabele w mojej bazy danych mają następującą strukturę

CREATE TABLE public.establecimiento 
(
    id_establecimiento integer NOT NULL, 
    establecimiento character varying(100) NOT NULL, 
    CONSTRAINT pk_establecimiento PRIMARY KEY (id_establecimiento) 
) 
WITH (
    OIDS=FALSE 
); 
CREATE TABLE public.establecimiento_sec 
(
    id_establecimiento_sec integer NOT NULL, 
    id_establecimiento integer NOT NULL, 
    det_seccion character varying(40) NOT NULL, 
    plano character varying(100), 
    sector_ingreso character varying(254), 
    sponsor_imagen_sec character varying(96000), 
    CONSTRAINT pk_establecimientos_sec PRIMARY KEY (id_establecimiento_sec , id_establecimiento), 
    CONSTRAINT fk_establec_reference_establec FOREIGN KEY (id_establecimiento) 
     REFERENCES public.establecimiento (id_establecimiento) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 
WITH (
    OIDS=TRUE 
); 
CREATE TABLE public.establecimiento_sec_plano 
(
    id_establecimiento_sec_plano integer NOT NULL, 
    id_establecimiento_sec integer NOT NULL, 
    id_establecimiento integer NOT NULL, 
    det_plano character varying(512), 
    cantidad integer NOT NULL, 
    precio double precision, 
    insert_charge double precision DEFAULT 0, 
    descr character varying(254), 
    CONSTRAINT pk_establecimiento_sec_plano PRIMARY KEY (id_establecimiento_sec_plano , id_establecimiento_sec , id_establecimiento), 
    CONSTRAINT fk_establecimiento_sec FOREIGN KEY (id_establecimiento, id_establecimiento_sec) 
     REFERENCES public.establecimiento_sec (id_establecimiento, id_establecimiento_sec) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE 
) 
WITH (
    OIDS=FALSE 
); 

definiowania podmiotu establecimientoSecPlano, zmienna $ establecimientoSec ​​zawierający klucze $ Establecimiento i $ id_establecimiento_sec

// Entity/EstablecimientosSecPlano

/** 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Ticketway\PruebaBundle\Entity\EstablecimientosSec") 
* @ORM\JoinColumns(
*  @ORM\JoinColumn(name="id_establecimiento_sec", referencedColumnName="id_establecimiento_sec"), 
*  @ORM\JoinColumn(name="id_establecimiento", referencedColumnName="id_establecimiento")) 
*/ 
private $establecimientoSec; 

// Entity/EstablecimientosSec

/** 
* @ORM\Id 
* @ORM\ManyToOne(targetEntity="Ticketway\PruebaBundle\Entity\Establecimientos") 
* @ORM\JoinColumn(name="id_establecimiento", referencedColumnName="id_establecimiento") 
*/ 
private $establecimiento; 

Podczas wykonywania doktrynę polecenia: mapowania: import otrzymuję następujący błąd

[Doctrine \ ORM \ Mapowanie \ MappingException] Nie można mapować podmiot „EstablecimientoSec” z kompozytu klucza podstawowego jako część klucza podstawowego innej jednostki "EstablecimientoSecPlano # idEstablecimiento".

Zastanawiam się, czy istnieje jakiś sposób zdefiniowania podmiotów w symfony i nie mogę zrobić z doktryną.

Czy mogę odwzorować funkcje w inny sposób, aby aplikacja działała poprawnie?

Mam nadzieję, że moje pytanie zostanie zrozumiane. dzięki

+0

Jakieś szanse na to? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html –

+0

sonda to rozwiązanie, ale bez powodzenia, dzięki i tak @Denis – Guillermo

+1

You * could * work around to przez przypisanie niezależnych, generowanych automatycznie, jedno-kolumnowych identyfikatorów dla wszystkich tabel i użycie 'id_establecimiento_sec_plano',' id_establecimiento_sec' oraz 'id_establecimiento' jako pól. (nie musisz mieć tego samego pola w wielu tabelach/obiektach, ponieważ możesz uzyskać dostęp do tych, którzy używają relacji). To znaczy.* jeśli * prawidłowo rozumiem Twój problem. – schemar

Odpowiedz

1

Występuje problem, ponieważ złożony klucz obcy jest złożonym kluczem podstawowym innego stołu. Nie jest to dobra praktyka rozwojowa, dlatego po prostu nie jest ona wspierana przez Doctrine, i mocno wątpię, że kiedykolwiek będzie.

Rozwiązanie 1 (preferowane):

Dodaj pojedynczy, automatycznego przyrostu klucz podstawowy do EstablecimientosSec. Następnie możesz utworzyć link do tego EstablecimientosSec.id.

Rozwiązanie 2:

Jeżeli zmiana struktury bazy danych jest absolutnie niemożliwe, nie mapować relacji. Zamiast tego można pobrać powiązane jednostki EstablecimientosSec w osobnej kwerendzie za pomocą złożonego klucza podstawowego. To nie jest doskonałe rozwiązanie, ale działa pod tymi ograniczeniami. Wskazówka: unikaj wysyłania zapytań do powiązanych obiektów w ramach pętli.

+0

Przepraszamy za późniejszą odpowiedź, w końcu skorzystałem z rozwiązania 1. Dzięki! – Guillermo

Powiązane problemy