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

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

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

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]刪除
最新教學 更多>
  • 如何使用觸發器和UDF從MySQL 5.1發送動態電子郵件通知?
    如何使用觸發器和UDF從MySQL 5.1發送動態電子郵件通知?
    如何從mysql 5.1 使用SMTP和OUTFILE 在test.emaildrop上插入之前,請創建觸發test.autosendfromdrop 每行開始 /*在此處啟動電子郵件文件的寫作*/ 選擇 concat(“ to:”,new.to), con...
    程式設計 發佈於2025-02-07
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令arr = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-02-07
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    在這里工作/},false); 不幸的是,答案是否。除非在Creation中存儲對處理程序的引用。 要解決此問題,請考慮將事件處理程序存儲在中心位置,例如頁面的主要對象,請考慮將事件處理程序存儲在中心位置,否則無法清理匿名事件處理程序。 。這允許在需要時輕鬆迭代和清潔處理程序。
    程式設計 發佈於2025-02-07
  • 在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在hibernate中保存枚舉值:故障排除錯誤的列type ,他們各自的映射至關重要。在Java中使用枚舉類型時,至關重要的是,建立冬眠的方式如何映射到基礎數據庫。 在您的情況下,您已將MySQL列定義為枚舉,並在Java中創建了相應的枚舉代碼。但是,您遇到以下錯誤:“ MyApp中的錯誤列類型...
    程式設計 發佈於2025-02-07
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    使用(1)而不是(;;)會導致無限循環的性能差異? 現代編譯器,(1)和(;;)之間沒有性能差異。 是如何實現這些循環的技術分析在編譯器中: perl: S-> 7 8 unstack v-> 4 -e語法ok 在GCC中,兩者都循環到相同的彙編代碼中,如下所示:。 globl t_時 ...
    程式設計 發佈於2025-02-07
  • 如何使用FormData()處理多個文件上傳?
    如何使用FormData()處理多個文件上傳?
    )處理多個文件輸入時,通常需要處理多個文件上傳時,通常是必要的。可以將fd.append("fileToUpload[]", files[x]);方法用於此目的,允許您在單個請求中發送多個文件。 初始嘗試 在JavaScript中,一種常見方法是:); 但是,此代碼僅處理第...
    程式設計 發佈於2025-02-07
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript 理解prefix keys primary鍵(movie_id(3))primary鍵(Movie_id) primary鍵(Movie_id) primary鍵(Movie_id) > `這將在整個Movie_ID列上建立標...
    程式設計 發佈於2025-02-07
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 問題:考慮以下CSS和HTML: position:fixed ; grid-template-columns:40%60%; grid-gap:5px; 背景: #eee; 當位置未固定時,網格將正確顯示。但是...
    程式設計 發佈於2025-02-07
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在java中的多個返回類型:一個誤解介紹,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但是,情況確實如此嗎? 通用方法:拆開神秘 [方法僅具有單一的返回類型。相反,它採用機制,如鑽石符號“ ”。 分解方法簽名: :本節定義了一個通用類型參數,E。它表示該方法接受了擴展foo類...
    程式設計 發佈於2025-02-07
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    在嘗試將image存儲在mysql數據庫中時,您可能會遇到一個可能會遇到問題。本指南將提供成功存儲您的圖像數據的解決方案。 easudy values('$ this-> ; image_id','file_get_contents($ tmp_imag...
    程式設計 發佈於2025-02-07
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-02-07
  • 如何將數據插入MySQL:相當於MS SQL的散裝插入物?
    如何將數據插入MySQL:相當於MS SQL的散裝插入物?
    在MySQL中插入:在數據庫管理的領域中拆開其等效於MS SQL 的等價,有效數據加載是必不可少的。 Microsoft SQL Server擁有批量插入命令,用於迅速從文本文件中導入數據。同樣,MySQL提供了一個類似的解決方案來完成此任務。 在MySQL中執行批量插入操作,使用的主要技術是負...
    程式設計 發佈於2025-02-07
  • 如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    [2使用內置的char_length()function。 char_length()和length() 此查詢將從指定的表中檢索所有行,並基於上升順序對它們進行排序指定列的字符長度。帶有更長字符串的行將出現在結果的底部。
    程式設計 發佈於2025-02-07
  • 如何使用LOAD_FILE故障排除MySQL Blob加載問題?
    如何使用LOAD_FILE故障排除MySQL Blob加載問題?
    加載文件加載到mysql blobs中,帶有load_file ,假設您會遇到問題,將文件加載到mysql blob中,專門使用load_file函數。如文檔中概述的,該功能的功能需要在服務器上滿足某些條件。這些條件包括:[在服務器主機文件對所有用戶的訪問性 文件大小以下下方的max_allowe...
    程式設計 發佈於2025-02-07
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    程式設計 發佈於2025-02-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3