Pendapat: Cara untuk memasukkan berbilang rekod dengan selamat ke lebih daripada satu jadual dalam Laravel

WBOY
Lepaskan: 2024-07-17 19:33:34
asal
661 orang telah melayarinya

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

Terdapat banyak cara untuk membunuh burung. Orang yang berbeza mempunyai cara unik mereka untuk melakukan sesuatu dengan berkesan, itulah sebabnya saya menambahkan PENDAPAT pada topik, ini adalah cara saya untuk memasukkan berbilang rekod ke lebih daripada satu jadual dan menjalankan perkhidmatan lain dengan berkesan.

Sebagai contoh, katakan anda ingin menjalankan perkhidmatan yang melakukan tugasan yang tidak disenaraikan dalam pengawal pendaftaran:

  • Semak sama ada pengguna baharu/bakal pelanggan wujud dalam pangkalan data.
  • Daftar Pengguna (sudah tentu kita mesti menyimpan rekod ini dalam jadual).
  • Log acara/aktiviti dalam jadual.
  • Log e-mel pengguna/nombor telefon baharu dalam tokens_table untuk pengesahan akaun.
  • Hantar E-mel yang mengandungi token yang akan tamat tempoh dalam masa 10 minit.
  • Hantar SMS yang mengandungi token yang akan tamat tempoh dalam 10 minit.

Intipati utama di sini ialah kami menjalankan berbilang perkhidmatan dalam pengawal dan semuanya mesti berjalan dengan jayanya supaya kami tidak mempunyai isu Transaksi Separa.

Satu Transaksi Separa boleh dihuraikan sebagai senario di mana hanya beberapa bahagian transaksi diselesaikan, yang membawa kepada ketidakkonsistenan data.

Bagaimanakah kami memastikan kami memberi panduan terhadap perkara ini?

Kami menggunakan fasad Transaksi Pangkalan Data yang tersedia untuk kami dalam rangka kerja Laravel.

Untuk menjalankan transaksi pangkalan data, kami perlu memberitahu pelaksana kod mengetahui ini adalah transaksi pangkalan data.

DB::beginTransaction();
Salin selepas log masuk

Kemudian kami mencipta blok cuba-tangkap supaya kami dapat menangkap ralat dengan mudah dan melakukan yang perlu. Blok cuba akan dimasukkan ke dalam pangkalan data manakala blok tangkapan akan menangkap sebarang ralat yang dihadapi.

Untuk kandungan dalam blok Cuba, kami akan ada

  1. Perkhidmatan untuk menyemak sama ada pengguna wujud.
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
Salin selepas log masuk
  1. Perkhidmatan untuk mendaftarkan pengguna baharu dan log aktiviti.
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
Salin selepas log masuk
  1. Jana token, log masuk dalam jadual token dan hantar acara yang sedang didengari oleh dua pendengar VerificationEmailListener **dan **VerificationSMSListener.
 $generateToken = generateTokenHelper();

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

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

Kemudian, bahagian paling penting dalam blok TRY ini ialah melakukan perubahan ini jika semua perkhidmatan berjalan dengan jayanya dan mengembalikan respons yang berjaya.

 DB::commit();

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

Jika semua perkhidmatan dalam blok percubaan ini berjaya, komit pangkalan data akan menyimpan transaksi ini ke dalam pangkalan data.

Sekarang Mari kita lihat bahagian blok Tangkap.

Jika transaksi/perkhidmatan gagal dalam blok CUBA, ia akan datang ke blok tangkapan. Jadi kami akan memanggil fasad DB sekali lagi untuk melancarkan semula setiap transaksi yang telah dimasukkan ke dalam pangkalan data seperti:

DB::rollBack();

return errorResponseHelper('fail', "Operation not successful, please retry");
Salin selepas log masuk

Fasad DB::rollBack() tidak akan menyimpan/mengembalikan setiap transaksi yang telah dimasukkan ke dalam pangkalan data tanpa masalah dalam milisaat.

Inilah cara saya membimbing terhadap ketidakkonsistenan data terutamanya apabila saya menjalankan lebih daripada satu transaksi pangkalan data dalam Laravel.

Blok kod penuh:

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");
        }
Salin selepas log masuk

Jika anda mempunyai sebarang soalan, jangan teragak-agak untuk melepaskannya.

Atas ialah kandungan terperinci Pendapat: Cara untuk memasukkan berbilang rekod dengan selamat ke lebih daripada satu jadual dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!