symfony - How to persist entities from an embedded form submission? -


मेरे पास एक व्यक्ति इकाई और एक पता इकाई है, सेट अप एक बी-दिशात्मक एक-से-एक रिश्ते के साथ, पता :

  ... वर्ग व्यक्ति {... / ** * @OR पर एफके के साथ \ OneToOne (targetEntity = "पता", मैप किया गया = "व्यक्ति") * / संरक्षित $ पता; ...} ... वर्ग पता {... / ** * @ORM \ Id * @ORM \ OneToOne (लक्ष्य = "व्यक्ति", इनवर्स्ड बाय = "पता") * @ORM \ JoinColumn (name = "personID" , संदर्भित कॉलमनाम = "आईडी") * / संरक्षित $ व्यक्ति; }   

पता अस्तित्व में एक समर्पित प्राथमिक कुंजी नहीं है, इसके बजाय इसके पहचान को व्यक्ति के साथ विदेशी कुंजी रिश्ते के माध्यम से प्राप्त होता है, जैसा कि

मेरे पास एक नया व्यक्ति बनाने के लिए फ़ॉर्म भी पता के लिए फार्म को एम्बेड करता है। जब फ़ॉर्म जमा किया जाता है, तो यह नियंत्रक क्रिया निष्पादित होती है:

  सार्वजनिक फ़ंक्शन createAction (अनुरोध $ अनुरोध) {$ person = new person (); $ Form = $ this- & gt; createCreateForm ($ person); $ फार्म & gt; handleRequest ($ अनुरोध); यदि ($ form- & gt; isValid ()) {$ em = $ this- & gt; getDoctrine () - & gt; getManager (); $ Em- & gt; जारी रहती है ($ व्यक्ति); $ Em- & gt; फ्लश (); $ $ लौटाएं- & gt; रीडायरेक्ट करें ($ this- & gt; जनरेट यूआरएल ('लोग')); } रिटर्न सरणी ('व्यक्ति' = & gt; $ व्यक्ति, 'फॉर्म' = & gt; $ form- & gt; createView (),); }   

मैंने डेटा का निरीक्षण किया है, और अपेक्षित रूप से उचित फ़ॉर्म विवरण के साथ $ person की अपनी $ address संपत्ति भर दी है । हालांकि, एक बार जब $ व्यक्ति ऑब्जेक्ट बनी रहती है, मुझे त्रुटि मिलती है:

रिश्ते के माध्यम से एक नई इकाई मिली 'एक्मे / एमीबंडल \ इकाई \ व्यक्ति # पता 'जिसे इकाई के लिए परिश्रम के संचालन के लिए कस्टर्ड नहीं किया गया था ...

मैंने कुछ चीजों की कोशिश की है और कोई भी काम नहीं कर रहा है:

  1. व्यक्ति वस्तु पर OneToOne रिश्ते परिभाषा पर cascade = {"persist"} सेट करना त्रुटि के परिणामस्वरूप ऐसा परिणाम कर रहे हैं:

    इकाई के प्रकार Acme \ AcmeBundle \ Entity \ Address फ़ील्ड 'व्यक्ति' के लिए एक असाइन आईडी गुम है ...

  2. Person # setAddress विधि पर, मैंने $ address पैरामीटर लिया है और मैन्युअल रूप से $ address- & gt; setPerson ($ this) पर यह। या तो काम नहीं करता। ऐसा लगता है कि मेरी समस्या यह है कि सिद्धांत पता वस्तु को व्यक्ति वस्तु को सहेजने से बचाने के लिए, और ऐसा इसलिए नहीं हो सकता क्योंकि उसे संबद्ध व्यक्ति की आईडी को पहले जानने की जरूरत है

    उदाहरण के लिए, यदि मैं इस तरह से कुछ करने के लिए जारी रखने वाले कोड को बदल देता हूं, तो यह काम करता है:

      ... // पते का पता निकालें और इसे व्यक्ति वस्तु $ पता से हटा दें = $ Person- & gt; मिलअड्रेस (); $ व्यक्ति & gt; setAddress (शून्य); // व्यक्ति को ऑब्जेक्ट सहेजें और फ्लश करें ताकि हमें आईडी $ em- & gt; जारी रहें ($ व्यक्ति); $ Em- & gt; फ्लश (); // अब पता पर व्यक्ति ऑब्जेक्ट सेट करें और पते $ पता- & gt; setPerson ($ person) को बचाएं; $ Em- & gt; ($ पते) जारी रहती है; $ Em- & gt; फ्लश (); ...   

    मैं यह कैसे ठीक से कर सकता हूँ? मैं इस प्रकार के एक-से-एक रिश्ते के साथ रूपों को एम्बेड करने की क्षमता को बरकरार रखना चाहता हूं, लेकिन जटिलताएं शुरू करना शुरू कर रहे हैं $ पता ऑब्जेक्ट को मैन्युअल रूप से ऊपर की तरह स्वयं कर के बिना $ person ऑब्जेक्ट फ्लश करने के लिए मैं सिद्धांत कैसे प्राप्त करूं?

    कैस्केड को रखें = जारी रहें

    फिर व्यक्ति :: सेटअड्डेचर

      वर्ग व्यक्ति {सार्वजनिक फ़ंक्शन सेटअड्डे ($ पता) {$ this- & gt; पता = $ पता; $ पते तक & gt; setPerson ($ इस); // *** यह वही है जिसे आप याद कर रहे हैं ***   

    यह एक बहुत ही सामान्य प्रश्न है, लेकिन इसकी खोज करना कठिन है।

Comments

Popular posts from this blog

asp.net - Procedure or function "Procedure name" expects a parameter "Param name" which was not supplied occurs rarely -

c# - The item with identity 'Id' already exists in the metadata collection. Parameter name: item -

c++ - Redefined variable in the other module -