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

WBOY
發布: 2024-07-17 19:33:34
原創
660 人瀏覽過

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 區塊將捕獲遇到的任何錯誤。

對於嘗試區塊中的內容,我們將有

  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");
        }
登入後複製

如果您有任何疑問,請隨時提出。

以上是自以為是:如何在 Laravel 中安全地將多筆記錄插入多個表中的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!