2013-06-11 15 views
7

Ich entwickle eine Anwendung in Symfony 2.3 mit Lehre 2.4 als ORM. Die Datenbank-Engine, die ich verwende, ist PostgreSQL. Ich habe Probleme beim Zuordnen von Entitäten mit zusammengesetzten Primärschlüsseln in anderen Tabellen. Diese Schlüssel sind Fremdschlüssel im zugehörigen Schlüssel.Symfony2 Doctrine ORM Composite Primärschlüssel

Die Tabellen in meiner Datenbank

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

Definition der Entität establecimientoSecPlano, $ establecimientoSec ​​Variable die Schlüssel $ establecimiento und $ 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; 
enthält die folgende Struktur aufweisen

// Entität/EstablecimientosSec

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

Wenn die Lehre Befehl ausführen: Mapping: import Ich erhalte den Fehler folgenden

[Lehre \ ORM \ Mapping \ MappingException] Es ist nicht möglich Einheit ‚EstablecimientoSec‘ mit einem zusammengesetzten Primärschlüssel kartieren Teil des Primärschlüssels einer anderen Entität "EstablecimientoSecPlano # idEstablecimiento".

Ich frage mich, ob es eine Möglichkeit gibt, die Entitäten in symfony zu definieren, und ich kann nicht mit der Lehre tun.

Kann ich die Funktionen auf andere Weise zuordnen, damit die Anwendung ordnungsgemäß funktioniert?

Ich hoffe meine Frage wird verstanden. Danke

+0

Alle Chancen, die das hilft? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html –

+0

Sonde diese Lösung aber ohne Erfolg, danke trotzdem @Denis – Guillermo

+1

Sie * könnte * umgehen Dazu werden unabhängige, automatisch generierte, einspaltige IDs für alle Tabellen zugewiesen und 'id_establecimiento_sec_plano', 'id_establecimiento_sec' und 'id_establecimiento' als Felder verwendet. (Sie müssen nicht dasselbe Feld in mehreren Tabellen/Entitäten haben, da Sie über die Relation auf diese zugreifen können). I.e.* Wenn * Ich verstehe dein Problem richtig. – schemar

Antwort

1

Dieses Problem tritt auf, weil Ihr zusammengesetzter Fremdschlüssel der zusammengesetzte Primärschlüssel einer anderen Tabelle ist. Dies ist keine gute Entwicklungspraxis, weshalb sie von der Doktrine einfach nicht unterstützt wird, und ich bezweifle stark, dass dies jemals der Fall sein wird.

Lösung 1 (bevorzugt):

Fügen Sie einen einzelnen, Autoinkrement Primärschlüssel EstablecimientosSec. Sie können dann stattdessen zu diesem EstablecimientosSec.id verknüpfen.

Lösung 2:

Wenn die Datenbankstruktur zu ändern absolut nicht möglich ist, kann die Beziehung nicht zuordnen. Stattdessen können Sie die zugehörigen Entitäten EstablecimientosSec in einer separaten Abfrage mithilfe des zusammengesetzten Primärschlüssels abrufen. Es ist keine perfekte Lösung, aber es funktioniert unter diesen Einschränkungen. Tipp: Vermeiden Sie, die zugehörigen Objekte als Teil einer Schleife abzufragen.

+0

Sorry für die spätere Antwort, schließlich habe ich die Lösung 1 verwendet. Danke! – Guillermo

Verwandte Themen