"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > लारवेल सॉफ़्टडिलीट: अद्वितीय बाधा समस्या से बचना

लारवेल सॉफ़्टडिलीट: अद्वितीय बाधा समस्या से बचना

2024-11-06 को प्रकाशित
ब्राउज़ करें:361

Laravel SoftDelete: Avoiding the Unique Constraint Problem

यह लेख 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

विज्ञप्ति वक्तव्य इस लेख को पुन: प्रस्तुत किया गया है: https://dev.to/afiqiqmal/laravel-softdelete-avoiding-the- अनांत-constraint-problem-8k2?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3