إستخدام Laravel DB Transaction كيف، ومتى، لتجنب الأخطاء أثناء إدخال البيانات

إستخدام Laravel DB Transaction كيف، ومتى، لتجنب الأخطاء أثناء إدخال البيانات

2024-05-13 وقت القراءه : 2 دقائق

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

مثال

لدينا الجدول التالي

 

وعند إدخال البيانات ، فإنه سوف يتم إدخال البيانات إلى جدول Transactions

 

وكذلك التعديل في جدول balance

 

لإدخال البيانات نستخدم الكود التالي

public function store(Request $request)
 {
     $userbalance = Balance::find($request->user_id);
     if (!$userbalance) {
         return back()->withErrors(['account' => 'Account not found']);
     }
     $transaction = new Transaction();
     $transaction->user_id = $request->user_id;
     $transaction->amount = $request->amount;
     $transaction->description = $request->description;
     $transaction->save();
     $userbalance->balance=  $userbalance->balance + $request->amount;
     $userbalance->save();
 }

 

لكن ماذا لو إنه لسبب ما تم إدخال البيانات في جدول Transactions ولم يتم تحديث جدول balance، فإنه سوف يحدث خلل في رصيد المستخدم.

لحل هذه المشكله يجب إستخدام DB::transactions، بحيث إنه إذا حصل خطأ في أي Transaction فإنه سوف يتم عمل rollback لجميع المدخلات.

إستخدام Transactions

public function store(Request $request)
 {
     $userbalance = Balance::find($request->user_id);
     if (!$userbalance) {
         return back()->withErrors(['account' => 'Account not found']);
     }
     DB::transaction(function () use ($request, $userbalance){
         $transaction = new Transaction();
         $transaction->user_id = $request->user_id;
         $transaction->amount = $request->amount;
         $transaction->description = $request->description;
         $transaction->save();
         $userbalance->balance=  $userbalance->balance + $request->amount;
         $userbalance->save();
     });
 }

من هنا نستنتج إنه اذا كانت المدخلات في جدولين إنه يجب إستخدام   DB:transaction 

إضافة تعليق
Loading...