"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > رأي: كيفية إدراج سجلات متعددة بأمان في أكثر من جدول في Laravel

رأي: كيفية إدراج سجلات متعددة بأمان في أكثر من جدول في Laravel

تم النشر بتاريخ 2024-08-06
تصفح:531

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

هناك طرق عديدة لقتل الطيور. يتمتع الأشخاص المختلفون بطرقهم الفريدة للقيام بالأشياء بفعالية، ولهذا السبب أضفت OPINIONATED إلى الموضوع، وهذه هي طريقتي لإدراج سجلات متعددة في أكثر من جدول واحد وتشغيل الخدمات الأخرى بشكل فعال.

على سبيل المثال، لنفترض أنك تريد تشغيل خدمة تقوم بهذه المهام المدرجة ضمن وحدة التحكم في التسجيل:

  • التحقق من وجود المستخدم الجديد/العميل المحتمل في قاعدة البيانات.
  • تسجيل مستخدم (بالطبع يجب علينا حفظ هذا السجل في جدول).
  • تسجيل الحدث/النشاط في جدول.
  • قم بتسجيل البريد الإلكتروني/رقم الهاتف للمستخدم الجديد في tokens_table للتحقق من الحساب.
  • إرسال بريد إلكتروني يحتوي على رمز مميز ستنتهي صلاحيته خلال 10 دقائق.
  • إرسال رسالة نصية قصيرة تحتوي على رمز ستنتهي صلاحيته في 10 دقائق.

الجوهر الرئيسي هنا هو أننا نقوم بتشغيل خدمات متعددة في وحدة التحكم ويجب تشغيلها جميعًا بنجاح حتى لا نواجه مشكلة معاملة جزئية.

يمكن وصف المعاملة الجزئية على أنها سيناريو يتم فيه إكمال بعض أجزاء المعاملة فقط، مما يؤدي إلى عدم تناسق البيانات.

كيف نتأكد من أننا نوجه ضد هذا؟

نحن نستخدم واجهة معاملات قاعدة البيانات المتاحة لنا بسهولة في إطار عمل Laravel.

لتشغيل معاملة قاعدة بيانات، نحتاج إلى السماح لمنفذ التعليمات البرمجية بمعرفة أن هذه معاملة قاعدة بيانات.

DB::beginTransaction();

ثم نقوم بإنشاء كتلة محاولة الالتقاط حتى نتمكن من اكتشاف الأخطاء بسهولة والقيام بما يلزم. سيتم إدراج كتلة المحاولة في قاعدة البيانات بينما ستلتقط كتلة الالتقاط أي أخطاء تمت مواجهتها.

بالنسبة للمحتوى الموجود في كتلة جرب، سيكون لدينا

  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");

إذا نجحت جميع الخدمات الموجودة في مجموعة المحاولة هذه، فسيقوم التزام قاعدة البيانات بحفظ هذه المعاملات في قاعدة البيانات.

الآن دعونا نلقي نظرة على جزء كتلة Catch.

إذا فشلت معاملة/خدمة في كتلة TRY، فسوف تصل إلى كتلة الالتقاط. لذلك سوف نقوم باستدعاء الواجهة DB مرة أخرى للتراجع عن كل معاملة تم إدراجها في قاعدة البيانات كما يلي:

DB::rollBack();

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

ستعمل واجهة DB::rollBack() على إلغاء/إعادة كل معاملة تم إدراجها في قاعدة البيانات دون مشاكل بالمللي ثانية.

هذه هي الطريقة التي أتجنب بها عدم تناسق البيانات خاصة عندما أقوم بتشغيل أكثر من معاملة قاعدة بيانات واحدة في Laravel.

كتلة التعليمات البرمجية الكاملة:

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