"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Obstinado: Cómo insertar de forma segura varios registros en más de una tabla en Laravel

Obstinado: Cómo insertar de forma segura varios registros en más de una tabla en Laravel

Publicado el 2024-08-06
Navegar:656

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

Hay muchas formas de matar un pájaro. Diferentes personas tienen sus formas únicas de hacer las cosas de manera efectiva, por eso agregué OPINIONADO al tema, esta es mi forma de insertar múltiples registros en más de una tabla y ejecutar otros servicios de manera efectiva.

Por ejemplo, digamos que desea ejecutar un servicio que realiza estas tareas enumeradas a continuación en un controlador de registro:

  • Compruebe si el nuevo usuario/cliente potencial existe en la base de datos.
  • Registrar Un Usuario (por supuesto debemos guardar este registro en una tabla).
  • Registra el evento/actividad en una tabla.
  • Registra el correo electrónico/número de teléfono del nuevo usuario en una tabla de tokens para verificar la cuenta.
  • Correo electrónico de envío que contiene un token que caducará en 10 minutos.
  • Envío de SMS que contiene un token que caducará en 10 minutos.

La esencia principal aquí es que estamos ejecutando múltiples servicios en un controlador y todos deben ejecutarse correctamente para que no tengamos un problema de transacción parcial.

Una Transacción parcial puede describirse como un escenario en el que solo se completan algunas partes de una transacción, lo que genera inconsistencia de datos.

¿Cómo nos aseguramos de orientarnos contra esto?

Utilizamos la fachada Transacciones de base de datos que tenemos disponible en el marco de Laravel.

Para ejecutar una transacción de base de datos, debemos informarle al ejecutor del código que se trata de una transacción de base de datos.

DB::beginTransaction();

Luego creamos un bloque try-catch para que podamos detectar errores fácilmente y hacer lo necesario. El bloque try se insertará en la base de datos mientras que el bloque catch detectará cualquier error encontrado.

Para los contenidos del bloque Probar, tendremos

  1. Un servicio para comprobar si un usuario existe.
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
  1. Un servicio para registrar un nuevo usuario y registrar la actividad.
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
  1. Genere un token, regístrelo en la tabla de tokens y envíe un evento que esté siendo escuchado por dos oyentes VerificationEmailListener **y **VerificationSMSListener.
 $generateToken = generateTokenHelper();

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

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

Entonces, la parte más importante de este bloque TRY es confirmar estos cambios si todos los servicios se ejecutan correctamente y devuelven una respuesta exitosa.

 DB::commit();

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

Si todos los servicios en este bloque de prueba tienen éxito, la confirmación de la base de datos guardará estas transacciones en la base de datos.

Ahora veamos la parte del bloque Catch.

Si una transacción/servicio falla en el bloque TRY, llegará al bloque catch. Entonces llamaremos a la fachada DB nuevamente para revertir cada transacción que se haya insertado en la base de datos de la siguiente manera:

DB::rollBack();

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

La fachada DB::rollBack() desguardará/revertirá cada transacción que se haya insertado en la base de datos sin problemas en milisegundos.

Así es como me guío contra la inconsistencia de datos, especialmente cuando estoy ejecutando más de una transacción de base de datos en Laravel.

El bloque de código completo:

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

Si tienes alguna pregunta, no dudes en dejarla.

Declaración de liberación Este artículo se reproduce en: https://dev.to/adetolaaremu/opinionated-how-to-safely-insert-multiple-records-to-more-than-one-table-in-laravel-96l?1Si hay alguno infracción, comuníquese con [email protected] para eliminar
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3