2013-06-11 29 views
7

Sto sviluppando un'applicazione in Symfony 2.3 con Doctrine 2.4 come ORM. Il motore di database che utilizzo è PostgreSQL. Ho problemi durante la mappatura delle entità con chiavi primarie composite in altre tabelle. Queste chiavi sono chiavi esterne nella chiave correlata.Symfony2 Doctrine ORM Composite Primary Keys

Le tabelle nel mio database hanno la seguente struttura

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 
); 

Definire l'entità establecimientoSecPlano, variabile $ establecimientoSec ​​contenente i tasti $ e $ establecimiento id_establecimiento_sec

// Entità/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; 

Quando si esegue il comando dottrina: la mappatura: import ottengo il seguente errore

[Doctrine \ ORM \ Mapping \ MappingException] Non è possibile mappare entità 'EstablecimientoSec' con una chiave primaria composita parte della chiave primaria di un'altra entità "EstablecimientoSecPlano # idEstablecimiento".

Mi chiedo se esiste un modo per definire le entità in symfony e non posso fare con la dottrina.

È possibile mappare le funzionalità in un altro modo affinché l'applicazione funzioni correttamente?

Spero che la mia domanda sia compresa. grazie

+0

Eventuali quote sono utili? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html –

+0

sondare quella soluzione ma senza successo, grazie comunque @Denis – Guillermo

+1

Si * potrebbe * aggirare questo assegnando ID indipendenti, autogenerati, a colonna singola per tutte le tabelle e usa 'id_establecimiento_sec_plano',' id_establecimiento_sec' e 'id_establecimiento' come campi. (non è necessario avere lo stesso campo in più tabelle/entità in quanto è possibile accedere a quelle che utilizzano la relazione). Cioè* se * capisco correttamente il tuo problema – schemar

risposta

1

Si sta verificando questo problema perché la chiave esterna composita è la chiave primaria composita di un'altra tabella. Questa non è una buona pratica di sviluppo, motivo per cui semplicemente non è supportata da Doctrine e dubito fortemente che lo sarà mai.

Soluzione 1 (preferito):

aggiungere una singola chiave primaria, di incremento automatico a EstablecimientosSec. È quindi possibile collegare a quello EstablecimientosSec.id invece.

Soluzione 2:

Se la modifica della struttura del database non è assolutamente possibile, non mappare il rapporto. Invece, è possibile recuperare le relative entità EstablecimientosSec in una query separata utilizzando la chiave primaria composita. Non è una soluzione prefetto, ma funziona sotto questi limiti. Suggerimento: evitare di interrogare gli oggetti correlati come parte di un ciclo.

+0

Scusate per la risposta successiva, finalmente ho usato la soluzione 1. Grazie! – Guillermo