कैस्केड = {"हटाएं"} वीएस अनाथमेवल = सच्चा वी.एस.


92

मैंने मूल इकाई को हटाए जाने पर स्वचालित रूप से बाल इकाई को हटाने के लिए निम्नलिखित तरीके के बारे में कुछ जानकारी इकट्ठा करने की कोशिश की। लगता है कि सबसे आम तरीका उन तीन एनोटेशन में से एक का उपयोग करना है: कैस्केड = {"निकालें"} या orphanRemoval = true या ondelete = "CASCADE"

मैं तीसरे एक के बारे में थोड़ा भ्रमित हूं : ondelete = "CASCADE" , इस बारे में सिद्धांत के आधिकारिक दस्तावेज में स्पष्टीकरण बहुत ही दुर्लभ हैं) और मुझे अच्छा लगेगा अगर कोई मुझे निम्नलिखित जानकारी की पुष्टि कर सके जो मैंने एकत्र की और अपने शोध से समझा। नेट और अनुभव ...

यह क्या करता है

कैस्केड = {"निकालें"}
==> उलटा पक्ष पर इकाई को हटा दिया जाता है जब मालिक पक्ष इकाई होती है। भले ही आप अन्य मालिकाना पक्ष के साथ एक बहुसंख्यक वर्ग में हों।
- संग्रह पर उपयोग किया जाना चाहिए (इसलिए OneToMany या ManyToMany संबंध में)
- ORM में कार्यान्वयन

orphanRemoval = true
==> व्युत्क्रम पक्ष पर इकाई को हटा दिया जाता है जब मालिक पक्ष इकाई होती है। और यह अब किसी अन्य सहयोगी पक्ष इकाई से जुड़ा नहीं है। (रेफरी doctrine official_doc - ORM में कार्यान्वयन
- OneToOne, OnetoMany या ManyToMany के साथ उपयोग किया जा सकता है

onDelete = "CASCADE"
==> यह डेटाबेस में विदेशी कुंजी कॉलम में डिलीट कैस्केड को जोड़ देगा
- यह रणनीति सही पाने के लिए थोड़ी मुश्किल है लेकिन बहुत शक्तिशाली और तेज हो सकती है। (Ref। doctrine official_doc ... लेकिन अधिक स्पष्टीकरण नहीं पढ़ा है)
- ORM को कम काम करना पड़ता है (करने के दो पिछले तरीके की तुलना में) और इसलिए उसका प्रदर्शन बेहतर होना चाहिए।

अन्य जानकारी
- उन सभी 3 तरीकों को द्विदिशीय संबंध संबंध संस्थाओं ( दाएं ??? ) पर लागू किया जाता है
- कैस्केड = {"हटाएं"} का उपयोग करके किसी भी विदेशी कुंजी onDelete = CASCADE को पूरी तरह से पास करता है। (रेफ। doctrine_official_doc )

कोड में इसे उपयोग करने के लिए कैसे करें

  • orphanRemoval और कैस्केड = {"निकालें"} को उलट इकाई वर्ग में परिभाषित किया गया है।
  • ondelete = "CASCADE" को मालिक इकाई में परिभाषित किया गया है
  • आप सिर्फ @ORM \ JoinColumn (onDelete = "CASCADE") भी लिख सकते हैं और डॉक्ट्रीन को अपने नामों को लॉक करने दें

झरना = { "निकालें"}

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", cascade={"remove"})
*/
protected $Phonenumbers

orphanRemoval सच =

/**
* @OneToMany(targetEntity="Phonenumber", mappedBy="contact", orphanRemoval=true)
*/
protected $Phonenumbers

onDelete = "CASCADE"

/** 
* @ManyToOne(targetEntity="Contact", inversedBy="phonenumbers")
* @JoinColumn(name="contact_id", referencedColumnName="contact_id", onDelete="CASCADE")
*/ 
protected $contact; 

1
इसका एक अच्छा स्पष्टीकरण है stackoverflow.com/questions/25515007/…
ग्रेगस्पारो

जवाबों:


60

onDelete="CASCADE"डेटाबेस द्वारा ही प्रबंधित किया जाता है। cascade={"remove"}सिद्धांत द्वारा प्रबंधित किया जाता है।

onDelete="CASCADE"तेजी से होता है क्योंकि संचालन सिद्धांत के बजाय डेटाबेस स्तर पर किए जाते हैं। निष्कासन डेटाबेस सर्वर द्वारा किया जाता है न कि डॉक्ट्रिन द्वारा। cascade={"remove"}सिद्धांत के साथ इकाई को स्वयं प्रबंधित करना पड़ता है और यह देखने के लिए अतिरिक्त जांच करेगा कि क्या इसकी कोई अन्य स्वामित्व वाली संस्था नहीं है। जब कोई अन्य मौजूद नहीं है तो यह इकाई को हटा देगा। लेकिन यह ओवरहेड बनाता है।


झरना = { "निकालें"}

  • व्युत्क्रम पक्ष की इकाई को हटा दिया जाता है जब मालिक पक्ष इकाई होती है। भले ही आप अन्य मालिकाना पक्ष के साथ एक बहुसंख्यक वर्ग में हों। नहीं, यदि इकाई किसी और चीज के स्वामित्व में है। इसे हटाया नहीं जाएगा।
  • संग्रह पर उपयोग किया जाना चाहिए (इसलिए OneToMany या ManyToMany संबंध में)
  • ओआरएम में कार्यान्वयन

orphanRemoval = "true"

  • व्युत्क्रम पक्ष की इकाई को हटा दिया जाता है जब मालिक पक्ष इकाई होती है और यह अब किसी अन्य सहयोगी पक्ष इकाई से जुड़ा नहीं है। बिल्कुल नहीं, यह सिद्धांत का व्यवहार करता है जैसे यह किसी अन्य संस्था के स्वामित्व में नहीं है, और इस तरह इसे हटा दें।
  • ओआरएम में कार्यान्वयन
  • OneToOne, OnetoMany या ManyToMany के साथ इस्तेमाल किया जा सकता है

onDelete = "CASCADE"

  • यह डिलीट कैस्केड को विदेशी कुंजी कॉलम में DATABASE में जोड़ देगा
  • यह रणनीति सही पाने के लिए थोड़ी मुश्किल है लेकिन बहुत शक्तिशाली और तेज हो सकती है। (यह सिद्धांत सरकारी ट्यूटोरियल का एक उद्धरण है ... लेकिन बहुत अधिक स्पष्टीकरण नहीं देखा गया है)
  • ओआरएम को कम काम करना पड़ता है (करने के दो पिछले तरीके की तुलना में) और इसलिए बेहतर प्रदर्शन होना चाहिए।

3
@ वाघल। कैस्केड पर आपकी टिप्पणियों के बारे में = {"हटाएं"} ==> मेरे पास इकाई अनुच्छेद और श्रेणी के बीच कईटोमनी संबंध हैं। जब मैं एक लेख ($ em-> remove ($ article);) हटाता हूं तो यह इस लेख EVEN से जुड़ी सभी श्रेणियों को हटा देता है यदि उन श्रेणियों को अन्य लेखों से भी जोड़ा जाता है। इसलिए मैं कहूंगा कि जैसा आप लिखते हैं वैसा व्यवहार नहीं होता।
एलेक्सिस_डे

2
@ वाघल। सिद्धांत के आधिकारिक पेज से orphanRemoval पर अपनी टिप्पणी के बारे में = "सही" मैंने जो वाक्य लिखा था, वह इकाई "उलटा तरफ की इकाई को हटा दिया गया है जब मालिक की साइड इकाई है, और यह किसी अन्य संस्थाओं द्वारा स्वयं की नहीं है"। सिद्धांत = अनाथर्मोवल
एलेक्सिस_डे

1
@Alexis_D, आपकी टिप्पणियों से पूरी तरह सहमत हैं इसका उत्तर गलत है और वास्तव में नए
Stepan Yudin

3
स्पष्ट उदाहरणों में से एक मैंने पढ़ा है: gist.github.com/pylebecq/f844d1f6860241d8b025
विक्टर एस

@VictorS लिंक बहुत स्पष्ट है। मैं अब डॉक्ट्रिन के साथ काम नहीं कर रहा हूं, इसलिए मुझे लगता है कि मैं अपने जवाब को अपडेट नहीं कर सकता कि यह कैसे काम करता है। अगर कोई मेरे जवाब को अपडेट कर सकता है जो बहुत अच्छा होगा।
वघाल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.