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