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

राय: लारवेल में एक से अधिक तालिकाओं में एकाधिक रिकॉर्ड सुरक्षित रूप से कैसे सम्मिलित करें

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

Opinionated: How to safely insert multiple records to more than one table in Laravel

किसी पक्षी को मारने के कई तरीके हैं। अलग-अलग लोगों के पास चीजों को प्रभावी ढंग से करने के अपने अनूठे तरीके होते हैं, यही कारण है कि मैंने विषय में OPINIONATED जोड़ा, यह एक से अधिक तालिकाओं में एकाधिक रिकॉर्ड डालने और अन्य सेवाओं को प्रभावी ढंग से चलाने का मेरा तरीका है।

उदाहरण के लिए, मान लें कि आप एक ऐसी सेवा चलाना चाहते हैं जो पंजीकरण नियंत्रक में इन सूचीबद्ध कार्यों को करती है:

  • जांचें कि क्या नया उपयोगकर्ता/संभावित ग्राहक डेटाबेस में मौजूद है।
  • एक उपयोगकर्ता पंजीकृत करें (बेशक हमें इस रिकॉर्ड को एक तालिका में सहेजना होगा)।
  • ईवेंट/गतिविधि को तालिका में लॉग करें।
  • खाता सत्यापन के लिए नए उपयोगकर्ता ईमेल/फोन नंबर को टोकन_टेबल में लॉग इन करें।
  • एक टोकन वाला ईमेल भेजें जो 10 मिनट में समाप्त हो जाएगा।
  • एक टोकन युक्त एसएमएस भेजें जो समाप्त हो जाएगा 10 मिनट में।

यहां मुख्य सार यह है कि हम एक नियंत्रक में कई सेवाएं चला रहे हैं और उन सभी को सफलतापूर्वक चलना चाहिए ताकि हमारे पास आंशिक लेनदेन समस्या न हो।

एक आंशिक लेनदेन को एक ऐसे परिदृश्य के रूप में वर्णित किया जा सकता है जहां लेनदेन के केवल कुछ हिस्से ही पूरे होते हैं, जिससे डेटा असंगति होती है

हम यह कैसे सुनिश्चित करें कि हम इसके विरुद्ध मार्गदर्शन करें?

हम लारवेल ढांचे में हमारे लिए आसानी से उपलब्ध डेटाबेस लेनदेन पहलू का उपयोग करते हैं।

डेटाबेस लेनदेन चलाने के लिए, हमें कोड निष्पादक को यह बताना होगा कि यह एक डेटाबेस लेनदेन है।

DB::beginTransaction();

फिर हम एक try-catch ब्लॉक बनाते हैं ताकि हम त्रुटियों को आसानी से पकड़ सकें और आवश्यक कार्य कर सकें। ट्राई ब्लॉक को डेटाबेस में डाला जाएगा जबकि कैच ब्लॉक आने वाली किसी भी त्रुटि को पकड़ लेगा।

Try ब्लॉक की सामग्री के लिए, हमारे पास

होगा
  1. यह जांचने के लिए एक सेवा कि कोई उपयोगकर्ता मौजूद है या नहीं।
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
  1. नए उपयोगकर्ता को पंजीकृत करने और गतिविधि को लॉग करने के लिए एक सेवा।
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
  1. एक टोकन जेनरेट करें, इसे टोकन तालिका में लॉग इन करें, और एक ईवेंट भेजें जिसे दो श्रोता VerificationEmailListener **और **VerificationSMSListener सुन रहे हैं।
 $generateToken = generateTokenHelper();

$userService->tokenLog($request->email, $generateToken[0]);

event(new VerificationTokenDispatch($request->email, $request->PhoneNumber, $generateToken[1]));

फिर, इस TRY ब्लॉक का सबसे महत्वपूर्ण हिस्सा इन परिवर्तनों को करना है यदि सभी सेवाएँ सफलतापूर्वक चलती हैं और एक सफल प्रतिक्रिया लौटाती हैं।

 DB::commit();

return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");

यदि इस प्रयास ब्लॉक में सभी सेवाएँ सफल हैं, तो डेटाबेस कमिट इन लेनदेन को डेटाबेस में सहेज लेगा।

अब आइए कैच ब्लॉक भाग को देखें।

यदि कोई लेनदेन/सेवा TRY ब्लॉक में विफल हो जाती है, तो यह कैच ब्लॉक में आ जाएगी। इसलिए हम डेटाबेस में डाले गए प्रत्येक लेनदेन को रोलबैक करने के लिए DB पहलू को फिर से कॉल करेंगे:

DB::rollBack();

return errorResponseHelper('fail', "Operation not successful, please retry");

DB::rollBack() मुखौटा डेटाबेस में डाले गए प्रत्येक लेन-देन को मिलीसेकेंड में बिना किसी समस्या के अनसेव/रोलबैक कर देगा।

इस तरह मैं डेटा असंगति के खिलाफ मार्गदर्शन करता हूं, खासकर जब मैं लारवेल में एक से अधिक डेटाबेस लेनदेन चला रहा हूं।

पूर्ण कोड ब्लॉक:

use Illuminate\Support\Facades\DB;


 DB::beginTransaction();

        try {
            $checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

            if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');

            $registerUser = $userService->registerUser($request);

            LogActivity($request->email, $request->phoneNumber);

            $generateToken = generateTokenHelper(); // returns an array, the first is encrypted the second is not

            $userService->tokenLog($request->email, $generateToken[0]);

            event(new VerificationTokenDispatch($request->email, $request->PhoneNumber, $generateToken[1])); // both SMS listeners and email listeners are listening to this event

            DB::commit();

            return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");
        } catch (\Throwable $th) {
            DB::rollBack();
            return errorResponseHelper('fail', "Operation not successful, please retry");
        }

यदि आपके कोई प्रश्न हैं, तो उसे छोड़ने में संकोच न करें।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/adetolaaremu/opinionated-how-to-safely-insert-multiple-records-to-more-than-one-table-in-laravel-96l?1यदि कोई है उल्लंघन, हटाने के लिए कृपया [email protected] से संपर्क करें
नवीनतम ट्यूटोरियल अधिक>

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

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

Copyright© 2022 湘ICP备2022001581号-3