यह लेख https://medium.com/@hafiqiqmal93/laravel-softdelete-avoiding-the-unique-constraint-problem-45381d9745a0
से उत्पन्न हुआ है।
यदि आप कुछ समय से लारवेल का उपयोग कर रहे हैं, खासकर जब परियोजनाओं में डेटा अखंडता शामिल होती है, तो संभवतः आप पहले ही सॉफ्टडिलीट सुविधा का सामना कर चुके हैं। बहुत उपयोगी है क्योंकि आप रिकॉर्ड्स को डेटाबेस से बाहर निकाले बिना "हटा" सकते हैं। लारवेल जो करता है वह बस एक delete_at टाइमस्टैम्प जोड़ देता है ताकि यह इसे हटाए गए के रूप में चिह्नित कर दे, लेकिन सिस्टम में बना रहता है। ऐतिहासिक डेटा को बनाए रखने के लिए यह सब ठीक है, लेकिन यह एक संभावित जटिल समस्या पेश करता है - जब आप सॉफ़्ट-डिलीट किए गए रिकॉर्ड को पुनर्स्थापित करते हैं तो अद्वितीय बाधाओं का क्या होता है?
यह एक समस्या बन जाती है जब आप किसी ऐसे रिकॉर्ड को पुनर्स्थापित करना चाहते हैं जिसके डेटाबेस में पहले से ही, उदाहरण के लिए, एक अद्वितीय ईमेल या उपयोगकर्ता नाम है। लारवेल बस एक त्रुटि देगा और कार्यवाही रोक देगा। सौभाग्य से, बहुत साफ तरीके से इस समस्या से बचने का एक आसान तरीका है।
आइए एक विशेषता का उपयोग करके समाधान पर चलते हैं जो आपको लारवेल में सॉफ्टडिलीट का उपयोग करते समय अद्वितीय बाधाओं को दूर करने में मदद करेगा।
आइए एक बुनियादी उदाहरण लें। कल्पना कीजिए कि आपके पास एक ईमेल फ़ील्ड वाली उपयोगकर्ता तालिका है जो अद्वितीय होनी चाहिए:
Schema::create('users', function (Blueprint $table) { $table->string('email')->unique(); $table->softDeletes(); });
यदि आप किसी उपयोगकर्ता को [email protected] ईमेल से सॉफ्ट डिलीट करते हैं और फिर बाद में उसी ईमेल से एक नया उपयोगकर्ता बनाते हैं, तो लारवेल एक त्रुटि उत्पन्न करते हुए ईमेल फ़ील्ड पर अद्वितीय बाधा के बारे में शिकायत करेगा। उसी स्थिति में, जब आप हटाए गए उपयोगकर्ता को पुनर्स्थापित करने का प्रयास करते हैं, तो लारवेल भी ईमेल फ़ील्ड पर अद्वितीय बाधा और उसी त्रुटि के बारे में शिकायत करेगा।
यह एक सिरदर्द बन जाता है, खासकर जब बड़े सिस्टम से निपटना हो जहां रिकॉर्ड बहाली एक सामान्य कार्य है।
इसे रोकने के लिए, जब कोई रिकॉर्ड सॉफ्ट डिलीट किया जाता है तो हम अद्वितीय फ़ील्ड के मानों को अस्थायी रूप से बदल सकते हैं और रिकॉर्ड वापस लाए जाने पर मूल मानों को पुनर्स्थापित कर सकते हैं। इस तरह, डेटाबेस सॉफ्ट डिलीट या रिस्टोर के दौरान अद्वितीय बाधा पर ट्रिप नहीं करता है।
लारवेल विशेषता इस कार्यक्षमता को समाहित करने का एक शानदार तरीका है। यहां एक विशेषता है जिसका उपयोग हम समस्या से निपटने के लिए कर सकते हैं:
trashed()) { foreach ($model->getDuplicateAvoidColumns() as $column) { // handle for Spatie Translatable library if (method_exists($model, 'getTranslatableAttributes')) { $translates = $model->getTranslatableAttributes(); if (in_array($column, $translates)) { foreach ($translates as $translate) { if ($translate === $column) { $values = $model->getTranslations($column); foreach ($values as $translation => $value) { $values[$translation] = (explode('--', $value)[1] ?? $value); } $model->setTranslations($column, $values); break; } } continue; } } if ($value = (explode('--', $model->{$column})[1] ?? null)) { $model->{$column} = $value; } } } }); static::deleted(function ($model): void { foreach ($model->getDuplicateAvoidColumns() as $column) { // handle for Spatie Translatable library if (method_exists($model, 'getTranslatableAttributes')) { $translates = $model->getTranslatableAttributes(); if (in_array($column, $translates)) { foreach ($translates as $translate) { if ($translate === $column) { $values = $model->getTranslations($column); foreach ($values as $translation => $value) { $values[$translation] = time() . '--' . $value; } $model->setTranslations($column, $values); break; } } continue; } } $model->{$column} = time() . '--' . $model->{$column}; } $model->save(); }); } }
यह विशेषता कुछ चीजें करती है:
यहां बताया गया है कि आप इस विशेषता को अपने लारवेल मॉडल में कैसे लागू कर सकते हैं:
class User extends Model { use SoftDeletes, AvoidDuplicateConstraintSoftDelete; // Specify which columns should avoid the unique constraint issue public function getDuplicateAvoidColumns(): array { return ['email', 'username']; } }
अपने मॉडल में **AvoidDuplicateConstraintSoftDelete** विशेषता जोड़कर और यह निर्दिष्ट करके कि किन कॉलमों को अद्वितीय बाधा संघर्षों से बचने की आवश्यकता है (जैसे ईमेल और उपयोगकर्ता नाम), आप आसानी से इन समस्याओं को रोक सकते हैं .
इसका मतलब यह है कि, सॉफ्ट डिलीट रिकॉर्ड की स्थिति में, यह कुछ अद्वितीय बाधाओं के कारण आगे के संचालन के साथ टकराव का कारण नहीं बनेगा। या, दूसरे शब्दों में, इस तरह से, आप अद्वितीय फ़ील्ड में टाइमस्टैम्प जोड़कर, अद्वितीयता के संदर्भ में डेटाबेस के लिए रिकॉर्ड को "छिपा हुआ" प्रस्तुत कर पाएंगे, लेकिन जरूरत पड़ने पर फिर भी पुनर्प्राप्त किया जा सकेगा।
जब आप एक बड़े डेटाबेस के साथ काम कर रहे हों तो यह काफी उपयोगी है और रिकॉर्ड की बहाली काफी आम है। जब भी आप सॉफ्ट-डिलीट उपयोगकर्ता या कोई अन्य मॉडल लाएंगे तो आपको हर बार "डुप्लिकेट एंट्री" त्रुटि से नहीं जूझना पड़ेगा।
लारवेल में सबसे उपयोगी चीज़ सॉफ़्टडिलीट है, लेकिन कभी-कभी यह अद्वितीय बाधाओं के साथ काम करते समय सिरदर्द देता है। यहां एक सरल, विशेषता-आधारित समाधान आता है जो समस्या से बचने का एक शानदार तरीका देगा, केवल हटाने पर अद्वितीय फ़ील्ड के अस्थायी परिवर्तन और बाद में पुनर्स्थापित करके। इस तरह आप निराशाजनक गलतियों से बचेंगे और अपने एप्लिकेशन को अपने डेटाबेस में अद्वितीय बाधाओं को तोड़े बिना सुचारू रूप से काम करने देंगे।
यदि आपके किसी क्षेत्र को बहुभाषी बना दिया गया है या आप स्पैटीज़ ट्रांसलेटेबल जैसे पुस्तकालयों का उपयोग करते हैं, तो उपरोक्त समाधान इनमें से प्रत्येक मामले में बिना किसी समस्या के काम करेगा। सॉफ़्टडिलेट्स आपको लचीलापन देने के लिए हैं, न कि आपके रास्ते में आने के लिए। उपरोक्त मामूली सुधार के साथ आप अधिकांश नुकसानों से बचेंगे और अपने डेटा को सुव्यवस्थित रखेंगे और अपने उपयोगकर्ताओं को खुश रखेंगे।
इस विशेषता को अपने मॉडलों में जोड़कर, आप अपना समय और सिरदर्द बचाएंगे, खासकर यदि आप बड़े डेटासेट के साथ काम कर रहे हैं जहां सॉफ्ट-डिलीट और रीस्टोरिंग अक्सर ऑपरेशन होते हैं। इसे अपने लारवेल प्रोजेक्ट में आज़माएं, और आप देखेंगे कि यह उन जटिल अद्वितीय बाधा समस्याओं को कितनी आसानी से संभालता है!
पढ़ने के लिए आपका शुक्रिया! सिस्टम डिज़ाइन और ई-कॉमर्स नवाचारों में नवीनतम अपडेट के बारे में सूचित रहने के लिए सदस्यता लेना न भूलें। हैप्पी डिजाइनिंग!
यदि आपको यह लेख ज्ञानवर्धक लगा है और आप सिस्टम डिजाइन और प्रौद्योगिकी रुझानों पर अधिक सामग्री के साथ अपडेट रहना चाहते हैं, तो मुझे फॉलो करना न भूलें:-
ट्विटर: https://twitter.com/hafiqdotcom
लिंक्डइन: https://www.linkedin.com/in/hafiq93
मेरे लिए कॉफी खरीदें: https://paypal.me/mhi9388 /
https://buymeacoffee.com/mhitech
माध्यम: https://medium.com/@hafiqiqmal93
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3