«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Мнение: как безопасно вставлять несколько записей в несколько таблиц в Laravel

Мнение: как безопасно вставлять несколько записей в несколько таблиц в Laravel

Опубликовано 6 августа 2024 г.
Просматривать:584

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

Есть много способов убить птицу. У разных людей есть свои уникальные способы эффективного ведения дел, поэтому я добавил OPINIONATED в эту тему. Это мой способ вставки несколько записей в несколько таблиц и эффективного запуска других сервисов.

Например, предположим, что вы хотите запустить службу, которая выполняет перечисленные ниже задачи в контроллере регистрации:

  • Проверьте, существует ли новый пользователь/потенциальный клиент в базе данных.
  • Зарегистрировать пользователя (конечно, мы должны сохранить эту запись в таблице).
  • Зарегистрируйте событие/действие в таблице.
  • Зарегистрируйте адрес электронной почты/номер телефона нового пользователя в таблице tokens_table для проверки аккаунта.
  • Отправить электронное письмо, содержащее токен, срок действия которого истекает через 10 минут.
  • Отправить SMS, содержащее токен, срок действия которого истекает. через 10 минут.

Основная суть здесь в том, что мы запускаем несколько сервисов на контроллере, и все они должны работать успешно, чтобы не возникло проблемы с частичной транзакцией.

Частичная транзакция может быть описана как сценарий, в котором завершаются только некоторые части транзакции, что приводит к несогласованности данных.

Как нам избежать этого?

Мы используем фасад Транзакции базы данных, доступный нам в среде Laravel.

Чтобы выполнить транзакцию базы данных, нам нужно сообщить исполнителю кода, что это транзакция базы данных.

DB::beginTransaction();

Затем мы создаем блок try-catch, чтобы мы могли легко обнаруживать ошибки и делать все необходимое. Блок try будет вставляться в базу данных, а блок catch будет обнаруживать любые возникающие ошибки.

Для содержимого блока Try у нас будет

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

Если все службы в этом блоке попытки прошли успешно, фиксация базы данных сохранит эти транзакции в базе данных.

Теперь давайте посмотрим на часть блока 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");
        }

Если у вас есть какие-либо вопросы, не стесняйтесь задавать их.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/adetolaaremu/opinionated-how-to-safely-insert-multiple-records-to-more-than-one-table-in-laravel-96l?1Если есть какие-либо нарушение, пожалуйста, свяжитесь с [email protected], чтобы удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3