"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Opinativo: Como inserir com segurança vários registros em mais de uma tabela no Laravel

Opinativo: Como inserir com segurança vários registros em mais de uma tabela no Laravel

Publicado em 2024-08-06
Navegar:194

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

Existem muitas maneiras de matar um pássaro. Diferentes pessoas têm suas maneiras únicas de fazer as coisas de forma eficaz, por isso adicionei OPINIONATED ao tópico, esta é a minha maneira de inserir múltiplos registros em mais de uma tabela e executar outros serviços de forma eficaz.

Por exemplo, digamos que você queira executar um serviço que executa estas tarefas sub-listadas em um controlador de registro:

  • Verifique se o novo usuário/cliente potencial existe no banco de dados.
  • Cadastre um usuário (é claro que devemos salvar esse registro em uma tabela).
  • Registre o evento/atividade em uma tabela.
  • Registre o e-mail/número de telefone do novo usuário em uma tokens_table para verificação da conta.
  • E-mail de envio contendo um token que expirará em 10 minutos.
  • Enviar SMS contendo um token que irá expirar em 10 minutos.

A ideia principal aqui é que estamos executando vários serviços em um controlador e todos eles devem ser executados com êxito para que não tenhamos um problema de Transação parcial.

Uma Transação Parcial pode ser descrita como um cenário em que apenas algumas partes de uma transação são concluídas, levando a inconsistência de dados.

Como podemos ter certeza de que estamos orientando contra isso?

Usamos a fachada Database Transactions prontamente disponível para nós na estrutura Laravel.

Para executar uma transação de banco de dados, precisamos informar ao executor do código que esta é uma transação de banco de dados.

DB::beginTransaction();

Em seguida, criamos um bloco try-catch para que possamos detectar erros facilmente e fazer o que for necessário. O bloco try será inserido no banco de dados enquanto o bloco catch capturará quaisquer erros encontrados.

Para o conteúdo do bloco Try, teremos

  1. Um serviço para verificar se existe um usuário.
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
  1. Um serviço para registrar um novo usuário e registrar a atividade.
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
  1. Gere um token, registre-o na tabela de tokens e despache um evento que está sendo ouvido por dois ouvintes VerificationEmailListener **e **VerificationSMSListener.
 $generateToken = generateTokenHelper();

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

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

Então, a parte mais importante deste bloco TRY é confirmar essas alterações se todos os serviços forem executados com sucesso e retornarem uma resposta bem-sucedida.

 DB::commit();

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

Se todos os serviços neste bloco try forem bem-sucedidos, o commit do banco de dados salvará essas transações no banco de dados.

Agora vamos dar uma olhada na parte do bloco Catch.

Se uma transação/serviço falhar no bloco TRY, ela irá para o bloco catch. Portanto, chamaremos a fachada DB novamente para reverter todas as transações que foram inseridas no banco de dados assim:

DB::rollBack();

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

A fachada DB::rollBack() cancelará o salvamento/reversão de todas as transações que foram inseridas no banco de dados sem problemas em milissegundos.

É assim que eu oriento contra inconsistência de dados, especialmente quando estou executando mais de uma transação de banco de dados no Laravel.

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

Se você tiver alguma dúvida, não hesite em respondê-la.

Declaração de lançamento Este artigo está reproduzido em: https://dev.to/adetolaaremu/opinionated-how-to-safely-insert-multiple-records-to-more-than-one-table-in-laravel-96l?1Se houver algum violação, entre em contato com [email protected] para excluir
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3