Heim > Backend-Entwicklung > PHP-Tutorial > 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

WBOY
Freigeben: 2024-07-17 19:33:34
Original
813 Leute haben es durchsucht

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 „Meinung“ 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 folgenden 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.
  • Versenden Sie eine E-Mail mit einem Token, der in 10 Minuten abläuft.
  • Senden Sie eine SMS mit einem Token, der abläuft in 10 Minuten.

Der Kernpunkt hier ist, dass wir mehrere Dienste in einem Controller ausführen und sie 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 dem entgegenwirken?

Wir verwenden die Datenbanktransaktionen-Fassade, 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();
Nach dem Login kopieren

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 die Inhalte im Block Ausprobieren 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!');
Nach dem Login kopieren
  1. Ein Dienst zum Registrieren eines neuen Benutzers und Protokollieren der Aktivität.
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
Nach dem Login kopieren
  1. Generieren Sie ein Token, protokollieren Sie es in der Tokentabelle und versenden Sie ein Ereignis, 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]));
Nach dem Login kopieren

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");
Nach dem Login kopieren

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

Jetzt schauen wir uns den Blockteil Catch an.

Wenn eine Transaktion/ein Dienst im TRY-Block fehlschlägt, kommt es zum Catch-Block. Deshalb rufen wir die DB-Fassade erneut auf, um jede Transaktion, die in die Datenbank eingefügt wurde, wie folgt zurückzusetzen:

DB::rollBack();

return errorResponseHelper('fail', "Operation not successful, please retry");
Nach dem Login kopieren

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");
        }
Nach dem Login kopieren

Wenn Sie Fragen haben, zögern Sie nicht, uns zu kontaktieren.

Das obige ist der detaillierte Inhalt vonMeinung: So fügen Sie mehrere Datensätze sicher in mehr als eine Tabelle in Laravel ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage