」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 自以為是:如何在 Laravel 中安全地將多筆記錄插入多個表中

自以為是:如何在 Laravel 中安全地將多筆記錄插入多個表中

發佈於2024-08-06
瀏覽:301

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

殺死一隻鳥的方法有很多種。不同的人有其獨特的有效做事方式,這就是為什麼我在主題中添加了 OPINIONATED,這是我將多個記錄插入多個表並有效運行其他服務的方式。

例如,假設您想要執行一個服務來在註冊控制器中執行這些未列出的任務:

  • 檢查資料庫中是否有新使用者/潛在客戶。
  • 註冊一個使用者(當然我們必須將這條記錄保存在表中)。
  • 將事件/活動記錄在表中。
  • 將新使用者的電子郵件/電話號碼記錄在 tokens_table 中以進行帳戶驗證。
  • 發送包含令牌的電子郵件,該令牌將在 10 分鐘後過期。
  • 發送包含將過期的令牌的短信 10 分鐘後。

這裡的主要要點是,我們在控制器中運行多個服務,它們必須全部成功運行,這樣我們就不會出現部分事務問題。

部分交易可以描述為只完成部分交易的場景,導致資料不一致

我們如何確保我們能夠避免這種情況?

我們使用 Laravel 框架中隨時可用的資料庫事務外觀。

要運行資料庫事務,我們需要讓程式碼執行器知道這是一個資料庫事務。

DB::beginTransaction();

然後我們建立一個 try-catch 區塊,這樣我們就可以輕鬆捕獲錯誤並執行需要的操作。 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區塊中的所有服務都成功,則資料庫提交會將這些事務保存到資料庫中。

現在讓我們來看看Catch區塊部分。

如果事務/服務在 TRY 區塊中失敗,它將到達 catch 區塊。因此,我們將再次呼叫 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