2014-07-07 8 views
46

मैं सिद्धांत संघों पर कैस्केड संचालन की अपनी समझ की जांच करना चाहता हूं। इस प्रश्न के प्रयोजन के लिए, मेरे पास दो मॉडल हैं: Customer और Insureeसिद्धांत कैस्केड संचालन को समझना

मैं एक Customer और Insuree और cascade{"all"} सेट के बीच कई रिश्ते के लिए कई परिभाषित है, मैं समझता हूँ कि इस होगा:

  • एक ग्राहक के लिए एक नया insuree जोड़ने से इस insuree जारी रहती है और में एक संघ का निर्माण करेगा टेबल में शामिल हों
  • संग्रह से बीमाकर्ता को हटाने से ग्राहक से बीमा को अलग कर दिया जाएगा और ग्राहक को बीमाकर्ता से अलग कर दिया जाएगा।
  • ग्राहक को हटाने से ग्राहक से जुड़े सभी बीमाकर्ता हटा दिए जाएंगे।

यह Customers पर एसोसिएशन की परिभाषा है।

/** 
* @ORM\ManyToMany(targetEntity="Insuree", inversedBy="customers", cascade={"all"}) 
* @ORM\JoinTable(name="customer_insuree", 
*  joinColumns={@ORM\JoinColumn(name="customer_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="insuree_id", referencedColumnName="id")} 
*) 
*/ 
protected $insurees; 

अगर मैं उलटा एक Insuree और Customer और cascade{"all"} सेट के बीच कई संबंध बनाने के लिए कई परिभाषित करते हैं, मैं समझता हूँ कि यह होगा:

  • एक insuree के लिए एक नया ग्राहक जोड़ने से इस ग्राहक जारी रहती है और पैदा करेगा जॉइन टेबल में एक एसोसिएशन।
  • संग्रह से किसी ग्राहक को निकालने से ग्राहक को बीमाकर्ता से अलग कर दिया जाएगा और ग्राहक से बीमा को अलग कर दिया जाएगा।
  • बीमाकर्ता को हटाने से जुड़े सभी ग्राहकों को हटा दिया जाएगा।

यह Insurees पर एसोसिएशन की परिभाषा है।

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"all"}) 
*/ 
protected $customers; 

मैं तो पर झरना जारी रहती है, विलय और अलग करने के रूप में संबंधों को परिभाषित है - insuree सभी संबद्ध ग्राहकों नहीं हटेंगे - यह केवल insuree और अपने ग्राहकों के बीच संघों को हटा देगा?

/** 
* @ORM\ManyToMany(targetEntity="Customer", mappedBy="insurees", cascade={"persist", "merge", "detach"}) 
*/ 
protected $customers; 
+1

क्या आप जांच नहीं सकते कि कैस्केडिंग रिश्तों की आपकी समझ कुछ 'ग्राहक और' बीमाकर्ता 'बनाकर सही है और रिकॉर्ड हटाने/जोड़ने शुरू कर रही है? – undefined

उत्तर

103

&

आप के बारे में cascade={"persist"} जिसका अर्थ है कि बने इकाई ए, सिद्धांत भी संग्रह में सभी बी संस्थाओं बना रहेगा सही हैं हटाने जारी रहती है।

आप cascade={"remove"} के बारे में भी सही हैं जिसका अर्थ है कि इकाई ए को हटाकर, सिद्धांत संग्रह में सभी बी इकाइयों को भी हटा देगा।
लेकिन मुझे संदेह है कि आप कभी भी ManyToMany एसोसिएशन पर इसका उपयोग करना चाहेंगे, क्योंकि जब आप एंट्री ए को हटा देते हैं जो इस बी ऑपरेशन को सभी बी इकाइयों को कैस्केड करता है, तो बी बी संस्थाएं अन्य ए इकाइयों से जुड़ी हो सकती हैं।

अलग & मर्ज

आप नहीं सही cascade={"detach"} के बारे में और cascade={"merge"}: कुछ आप करने की ज़रूरत (अपने कोड में)

जोड़ना/संग्रह से संस्थाओं को हटाने है। उस here के बारे में पढ़ें।

का अर्थ है कि आप EntityManager से किसी इकाई को अलग करते हैं। EntityManager अब उस इकाई का प्रबंधन नहीं करेगा। यह एक अलग इकाई को एक नई तत्काल इकाई के समान बनाता है, सिवाय इसके कि यह पहले से ही डेटाबेस में है (लेकिन आपने EntityManager को इसके बारे में अनजान बना दिया है)।

दूसरे शब्दों में: cascade={"detach"} का अर्थ है कि इकाई ए को अलग करना, सिद्धांत संग्रह में सभी बी इकाइयों को भी अलग करेगा।

मर्जके विपरीत अलग है: आप एक अलग इकाई EntityManager में वापस मर्ज हो जाएंगे।
ध्यान दें कि merge() वास्तव में नया प्रबंधित ऑब्जेक्ट लौटाएगा, आपके द्वारा पारित पृथक ऑब्जेक्ट अप्रबंधित रहता है।

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