首页 > 后端开发 > php教程 > 自以为是:如何在 Laravel 中安全地将多条记录插入到多个表中

自以为是:如何在 Laravel 中安全地将多条记录插入到多个表中

WBOY
发布: 2024-07-17 19:33:34
原创
811 人浏览过

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

杀死一只鸟的方法有很多种。不同的人有其独特的有效做事方式,这就是为什么我在主题中添加了 OPINIONATED,这是我将多条记录插入多个表并有效运行其他服务的方式。

例如,假设您想要运行一个服务来在注册控制器中执行这些未列出的任务:

  • 检查数据库中是否存在新用户/潜在客户。
  • 注册一个用户(当然我们必须将这条记录保存在表中)。
  • 将事件/活动记录在表格中。
  • 将新用户的电子邮件/电话号码记录在 tokens_table 中以进行帐户验证。
  • 发送包含令牌的电子邮件,该令牌将在 10 分钟后过期。
  • 发送包含将过期的令牌的短信 10 分钟后。

这里的主要要点是,我们在控制器中运行多个服务,并且它们必须全部成功运行,这样我们就不会出现部分事务问题。

部分交易可以描述为只完成部分交易的场景,导致数据不一致

我们如何确保我们能够避免这种情况?

我们使用 Laravel 框架中随时可用的 数据库事务外观。

要运行数据库事务,我们需要让代码执行器知道这是一个数据库事务。

DB::beginTransaction();
登录后复制

然后我们创建一个 try-catch 块,这样我们就可以轻松捕获错误并执行需要的操作。 try 块将插入到数据库中,而 catch 块将捕获遇到的任何错误。

对于尝试块中的内容,我们将有

  1. 检查用户是否存在的服务。
$checkIfUserExists = $userService->userExists($request->email, $request->phoneNumber);

if ($checkIfUserExists) return errorResponseHelper('fail', 'User exists!');
登录后复制
  1. 注册新用户并记录活动的服务。
 $userService->registerUser($request);

 LogActivity($request->email, $request->phoneNumber);
登录后复制
  1. 生成一个令牌,将其记录在令牌表中,并调度一个由两个侦听器VerificationEmailListener **和**VerificationSMSListener正在侦听的事件。
 $generateToken = generateTokenHelper();

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

event(new VerificationTokenDispatch($request->email, $request->PhoneNumber, $generateToken[1]));
登录后复制

然后,这个 TRY 块中最重要的部分是在所有服务成功运行并返回成功响应的情况下提交这些更改。

 DB::commit();

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

如果这个try块中的所有服务都成功,数据库提交会将这些事务保存到数据库中。

现在让我们看看 Catch 块部分。

如果事务/服务在 TRY 块中失败,它将进入 catch 块。因此,我们将再次调用 DB 外观来回滚已插入数据库的每个事务,如下所示:

DB::rollBack();

return errorResponseHelper('fail', "Operation not successful, please retry");
登录后复制

DB::rollBack() 外观将在几毫秒内取消保存/回滚已插入数据库的每个事务,不会出现任何问题。

这就是我防止数据不一致的方法,尤其是当我在 Laravel 中运行多个数据库事务时。

完整代码块:

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");
        }
登录后复制

如果您有任何疑问,请随时提出。

以上是自以为是:如何在 Laravel 中安全地将多条记录插入到多个表中的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板