2012-08-17 5 views
10

की ओर से एक के मालिक से संबंध बने नहीं मेरे पास है इस कोडसिद्धांत 2 कई

// ONE to many Bidir -- inverse side 
    /** 
    * @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
    **/ 
    protected $items; 

दूसरी तरफ

// ONE to many Bidir-- own side 
    /** 
    * @ORM\ManyToOne(targetEntity="Room", inversedBy="items") 
    * @ORM\JoinColumn(name="room_id", referencedColumnName="id") 
    **/ 
    protected $room; 

मेरे समस्या यह है कि मैं आइटम पृष्ठ पर जाएँ और मैं कमरे का चयन करें, तो मैं कमरे में पेज

में preselecetd आइटम देख सकते हैं लेकिन अगर मैं कमरे में पृष्ठ पर जाएँ और मैं कई मदों एकाधिक चयन करें करने के लिए प्रयास करते हैं, तो उन कायम नहीं कर रहे हैं

+०१२३५१६४१०६१

संपादित करें: मैंने देखा है कि यह केवल OneToMany संबंध जहाज के लिए हो रहा है।

मैं बैकएंड ऐसा क्षेत्र है जहां मैं फार्म और सलेक्ट बॉक्स जहां मैं कई आइटम चुन सकते है के बारे में बात कर रहा हूँ: Manyto कई के लिए वे ठीक

EDIT2 काम कर रहे हैं। यह फॉर्म/सीआरयूडी कोड/नियंत्रक सिद्धांत द्वारा जेनरेट किए जाते हैं। इसलिए मुझे कोई अतिरिक्त फ़ंक्शन जोड़ने की आवश्यकता नहीं है। यह किसी भी तरह मेरी नियंत्रक कोड

$editForm = $this->createForm(new RoomType(), $entity); 


     $request = $this->getRequest(); 

     $editForm->bindRequest($request); 
     if ($editForm->isValid()) { 
      $em->persist($entity); 
      $em->flush(); 

जब मैं इस

foreach($entity->getItems() as $item) 
     echo $item; 

तरह नियंत्रक में से गुजरने के लिए तो मैं सभी thye आइटम देख सकते हैं वहाँ की कोशिश है। तो इसका मतलब है कि सभी वस्तुओं मुख्य वस्तु में हैं लेकिन यह उनका पालन नहीं कर रहा है। मुझे नहीं पता क्यों।

यदि कोई कारण है, विपरीत पक्ष समस्या है।

+1

यह सुनिश्चित करने के लिए प्रोत्साहित करता हूं कि आपका कोड कैसा दिखता है या आपका डेटाबेस, कुछ उदाहरण उपयोगी होंगे। – Asciiom

उत्तर

10

अपने कोड गलत है, एनोटेशन में आपकी टिप्पणियों के आधार पर, मैं उलटा और उलटा होने के कारण रिश्ते को कैसे जोड़ सकता हूं। क्योंकि आप inversedBy विशेषता निर्दिष्ट

यह मालिक पक्ष है:

/** 
* ONE to many Bidir -- owning side 
* @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
**/ 
protected $items; 

तो:

/** 
* ONE to many Bidir-- Inverse side 
* @ORM\ManyToOne(targetEntity="Room", inversedBy="items") 
* @ORM\JoinColumn(name="room_id", referencedColumnName="id") 
**/ 
protected $room; 

यह उलटा पक्ष है (क्योंकि यह mappedBy विशेषता है) आपका कोड कहता है: Item स्वामित्व वाला पक्ष है, Room विपरीत पक्ष है।

द्विदिश रिश्ते की ओर मालिक inversedBy OneToOne की विशेषता, ManyToOne, या ManyToMany मानचित्रण घोषणा के उपयोग द्वारा अपने उलटा पक्ष का उल्लेख करना चाहिए। उलटा हुआ गुण उस क्षेत्र में फ़ील्ड को निर्दिष्ट करता है जो संबंध के विपरीत पक्ष है।

इसे और अधिक स्वच्छ बनाने के लिए:

मालिक पक्ष OneToOne, ManyToOne, या ManyToMany मानचित्रण घोषणा के inversedBy विशेषता का उपयोग करना पड़ता है।उलटा हुआ में उलटा-पक्ष पर एसोसिएशन-फ़ील्ड का नाम शामिल है।

है, उलटा पक्ष के लिए:

द्विदिश रिश्ते की उलटा पक्ष अपने मालिक पक्ष को उपयोग की mappedBy विशेषता OneToOne, के द्वारा उल्लेख करना चाहिए OneToMany, या ManyToMany मैपिंग घोषणा। MappedBy विशेषता उस क्षेत्र में फ़ील्ड को निर्दिष्ट करती है जो संबंध का मालिक है।

और, फिर से:

उलटा पक्ष OneToOne, OneToMany, या ManyToMany मानचित्रण घोषणा के mappedBy विशेषता का उपयोग करना पड़ता है। MappedBy विशेषता में स्वामित्व वाले पक्ष में एसोसिएशन-फ़ील्ड का नाम शामिल है।

इसके अलावा, एक और महत्वपूर्ण विचार:

ManyToOne हमेशा एक द्विदिश एसोसिएशन के मालिक पक्ष है।

OneToMany हमेशा एक द्विदिश एसोसिएशन के प्रतिलोम पक्ष

इस प्रकार है, उलटा पक्ष (कमरे) से आइटम बने के लिए, आप की जाँच करने के जो आइटम का चयन किया जा चुका है/सही का निशान हटाने और कमरे पहले से ही शामिल है कि है वस्तु या नहीं।

+2

मैं यह कहने में गलत हो सकता हूं कि किन पक्ष का स्वामित्व है और उलटा है लेकिन कोड दोनों दिशाओं में काम करना चाहिए। मैं प्रत्येक तरफ और दोनों पर भी कैस्केड {persist} ट्रेड किया लेकिन यह काम नहीं किया। भले ही आप उस कमरे के लिए कोई आइटम न हों, और मैं 5 आइटम का चयन करता हूं, डेटाबेस में कुछ भी नहीं जा रहा है। और यह एक और कक्षा के लिए हो रहा है। तो मुझे लगता है कि मुझे होने के विपरीत मेरे कोड में कुछ जोड़ने की ज़रूरत है। क्या मेरा कोड ठीक है और इसके विपरीत क्या है – user825904

3

बस कमरे सेट करने के लिए आपको लूप का उपयोग करें। आइटम पक्ष के किनारे है और आप विपरीत पक्ष (कमरा) संपादित कर रहे हैं। सिम्फनी 2 विपरीत विपरीत संपादन करते समय कभी भी पक्षों को अपडेट नहीं करता है। उलटा पक्ष पर

foreach($entity->getItems() as $item){ 
    $item->setRoom($room); 
} 

और झरना:

/** 
* @ORM\OneToMany(targetEntity="Item", mappedBy="Room", cascade={"persist"}) 
**/ 
protected $items; 

अपनी परियोजनाओं मैं संग्रह घटनाओं श्रोताओं के आधार पर पुन: प्रयोज्य समाधान बना लिए

आप के लिए सबसे सरल समाधान के बने कमरे से पहले लूप का उपयोग करें। यदि आपके पास समय & कौशल है तो मैं आपको

+0

मुझे लगता है कि मुझे लूप में भी आइटम को जारी रखने की आवश्यकता है। आप किस संग्रह कार्यक्रम के बारे में बात कर रहे हैं, क्या आप मुझे संदर्भ या कोई लिंक दे सकते हैं। – user825904

+0

यदि आपको विपरीत पक्ष पर कैस्केड मिला है, तो आपको उन्हें जारी रखने की आवश्यकता नहीं है। यदि आप इसे पहले प्राप्त करते हैं तो संभवतः सभी ऑब्जेक्ट डेटा सहेजे गए थे, लेकिन बिना माता-पिता के कमरे। –

+0

फॉर्म इवेंट्स के बारे में पढ़ें: http: // stackoverflow।कॉम/प्रश्न/96510 9 5/विवरण-ऑफ-सिम्फनी 2-फॉर्म-इवेंट्स, संग्रह सिर्फ एम्बेडिंग आइटम है –