2013-06-11 10 views
7

मैं सिद्धांत 2.4 ORM के रूप में साथ Symfony 2.3 में एक आवेदन के विकास कर रहा हूँ। मैं जिस डेटाबेस इंजन का उपयोग करता हूं वह PostgreSQL है। अन्य तालिकाओं में समग्र प्राथमिक कुंजी के साथ इकाइयों को मैप करते समय मुझे समस्याएं आ रही हैं। ये कुंजी संबंधित कुंजी में विदेशी कुंजी हैं।Symfony2 सिद्धांत ORM समग्र प्राथमिक कुंजी

मेरी डेटाबेस में तालिकाओं निम्नलिखित संरचना

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

इकाई establecimientoSecPlano परिभाषित है, $ establecimientoSec ​​कुंजियों युक्त $ Establecimiento और $ id_establecimiento_sec

चर

// इकाई/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; 

जब आदेश सिद्धांत को क्रियान्वित: मानचित्रण: आयात मैं निम्न त्रुटि

[सिद्धांत \ ORM \ मानचित्रण \ MappingException] यह रूप में एक समग्र प्राथमिक कुंजी के साथ इकाई 'EstablecimientoSec' मैप करने के लिए संभव नहीं है मिल किसी अन्य इकाई 'EstablecimientoSecPlano # idEstablecimiento' की प्राथमिक कुंजी का हिस्सा।

मुझे आश्चर्य है कि सिम्फनी में इकाइयों को परिभाषित करने का कोई तरीका है और मैं सिद्धांत के साथ नहीं कर सकता।

क्या मैं एप्लिकेशन को सही तरीके से काम करने के लिए अन्य तरीकों से सुविधाओं को मैप कर सकता हूं?

मुझे आशा है कि मेरा प्रश्न समझा जाएगा। धन्यवाद

+0

इससे कोई बाधा इससे मदद मिलती है? http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html –

+0

समाधान की जांच करें लेकिन बिना सफलता के, धन्यवाद @ डेनिस – Guillermo

+1

आप * काम कर सकते हैं * यह सभी तालिकाओं के लिए स्वतंत्र, स्वत: जेनरेट, सिंगल-कॉलम आईडी असाइन करके और 'id_establecimiento_sec_plano',' id_establecimiento_sec', और 'id_establecimiento' फ़ील्ड के रूप में उपयोग करके। (आपको एकाधिक तालिकाओं/इकाइयों में एक ही फ़ील्ड रखने की आवश्यकता नहीं है क्योंकि आप संबंधों का उपयोग करने वाले लोगों तक पहुंच सकते हैं)। अर्थात।* अगर * मैं आपकी समस्या को सही ढंग से समझता हूं। – schemar

उत्तर

1

आप इस समस्या में भाग रहे हैं क्योंकि आपकी समग्र विदेशी कुंजी एक और तालिका की समग्र प्राथमिक कुंजी है। यह एक अच्छा विकास अभ्यास नहीं है, यही कारण है कि यह सिद्धांत द्वारा समर्थित नहीं है, और मुझे दृढ़ता से संदेह है कि यह कभी भी होगा।

समाधान 1 (पसंदीदा):

EstablecimientosSec के लिए एक एकल, ऑटो वेतन वृद्धि प्राथमिक कुंजी जोड़ें। इसके बाद आप उस EstablecimientosSec.id से लिंक कर सकते हैं।

समाधान 2:

तो डेटाबेस संरचना बदल बिल्कुल संभव नहीं है, रिश्ते को मैप नहीं है। इसके बजाय, आप समग्र प्राथमिक कुंजी का उपयोग कर संबंधित EstablecimientosSec इकाइयों को एक अलग क्वेरी में ला सकते हैं। यह एक प्रीफेक्ट समाधान नहीं है, लेकिन यह इन बाधाओं के तहत काम करता है। युक्ति: लूप के हिस्से के रूप में संबंधित वस्तुओं से पूछताछ से बचें।

+0

बाद के उत्तर के लिए खेद है, अंततः मैंने समाधान 1 का उपयोग किया। धन्यवाद! – Guillermo

संबंधित मुद्दे