„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Meinung: So fügen Sie mehrere Datensätze sicher in mehr als eine Tabelle in Laravel ein

Meinung: So fügen Sie mehrere Datensätze sicher in mehr als eine Tabelle in Laravel ein

Veröffentlicht am 06.08.2024
Durchsuche:701

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

Es gibt viele Möglichkeiten, einen Vogel zu töten. Verschiedene Menschen haben ihre eigenen Methoden, Dinge effektiv zu erledigen. Aus diesem Grund habe ich OPINIONATED zum Thema hinzugefügt. Dies ist meine Art, mehrere Datensätze in mehr als eine Tabelle einzufügen und andere Dienste effektiv auszuführen.

Angenommen, Sie möchten einen Dienst ausführen, der die unten aufgeführten Aufgaben in einem Registrierungscontroller ausführt:

  • Überprüfen Sie, ob der neue Benutzer/potenzielle Kunde in der Datenbank vorhanden ist.
  • Registrieren Sie einen Benutzer (natürlich müssen wir diesen Datensatz in einer Tabelle speichern).
  • Protokollieren Sie das Ereignis/die Aktivität in einer Tabelle.
  • Tragen Sie die E-Mail-/Telefonnummer des neuen Benutzers zur Kontobestätigung in einer tokens_table ein.
  • Versand-E-Mail mit einem Token, das in 10 Minuten abläuft.
  • Senden Sie eine SMS mit einem Token, das abläuft in 10 Minuten.

Der Kernpunkt hierbei ist, dass wir mehrere Dienste in einem Controller ausführen und diese alle erfolgreich ausgeführt werden müssen, damit wir kein Problem mit Teiltransaktionen haben.

Eine Teiltransaktion kann als ein Szenario beschrieben werden, in dem nur einige Teile einer Transaktion abgeschlossen werden, was zu Dateninkonsistenz führt.

Wie stellen wir sicher, dass wir dagegen vorgehen?

Wir verwenden die Fassade Datenbanktransaktionen, die uns im Laravel-Framework zur Verfügung steht.

Um eine Datenbanktransaktion auszuführen, müssen wir dem Code-Ausführer mitteilen, dass es sich um eine Datenbanktransaktion handelt.

DB::beginTransaction();

Dann erstellen wir einen try-catch-Block, damit wir Fehler leicht erkennen und das Notwendige tun können. Der Try-Block wird in die Datenbank eingefügt, während der Catch-Block alle aufgetretenen Fehler abfängt.

Für den Inhalt im Block Try haben wir

  1. Ein Dienst zur Überprüfung, ob ein Benutzer existiert.
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
  1. Ein Dienst zum Registrieren eines neuen Benutzers und Protokollieren der Aktivität.
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
  1. Generieren Sie ein Token, protokollieren Sie es in der Tokentabelle und senden Sie ein Ereignis aus, das von zwei Listenern abgehört wird VerificationEmailListener **und **VerificationSMSListener.
 $generateToken = generateTokenHelper();

$userService->tokenLog($request->email, $generateToken[0]);

event(new VerificationTokenDispatch($request->email, $request->PhoneNumber, $generateToken[1]));

Dann besteht der wichtigste Teil dieses TRY-Blocks darin, diese Änderungen zu übernehmen, wenn alle Dienste erfolgreich ausgeführt werden und eine erfolgreiche Antwort zurückgeben.

 DB::commit();

return successResponseHelper('success', "OTP has been sent to your mobile/email, kindly note that OTP validity is 10 minutes");

Wenn alle Dienste in diesem Try-Block erfolgreich sind, speichert der Datenbank-Commit diese Transaktionen in der Datenbank.

Schauen wir uns nun den Blockteil Catch an.

Wenn eine Transaktion/ein Dienst im Block TRY fehlschlägt, gelangt sie zum Catch-Block. Deshalb rufen wir die DB-Fassade erneut auf, um alle in die Datenbank eingefügten Transaktionen wie folgt zurückzusetzen:

DB::rollBack();

return errorResponseHelper('fail', "Operation not successful, please retry");

Die DB::rollBack()-Fassade wird jede Transaktion, die in die Datenbank eingefügt wurde, innerhalb von Millisekunden ohne Probleme rückgängig machen/ein Rollback durchführen.

Dies ist mein Leitfaden gegen Dateninkonsistenzen, insbesondere wenn ich mehr als eine Datenbanktransaktion in Laravel ausführe.

Der vollständige Codeblock:

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");
        }

Wenn Sie Fragen haben, zögern Sie nicht, diese zu hinterlassen.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/adetolaaremu/opinionated-how-to-safely-insert-multiple-records-to-more-than-one-table-in-laravel-96l?1Falls vorhanden Verstoß, wenden Sie sich zum Löschen bitte an [email protected]
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3