Using Database Transactions in Laravel 6’s Eloquent ORM
1. Use database transactions in Laravel 6’s Eloquent ORM. The application only uses PHP 7.0 and later, so replace \Exception with \Throwable. Reference:https://stackoverflow.com/questions/49814785/how-can-i-use-transaction-with-eloquent-laravel-5-5
2. The final implementation code is as follows
DB::beginTransaction();
try {
$themeInstallation = new ThemeInstallation();
$themeInstallation->theme_store_theme_id = $saasThemeConfig[$name]['id'];
$themeInstallation->theme_id = $name;
$themeInstallation->wp_theme_id = $wpTheme->id;
$themeInstallation->theme_custom_name = $custom_name;
$themeInstallation->save();
$themeInstallationVersion = new ThemeInstallationVersion();
$themeInstallationVersion->theme_installation_id = $themeInstallation->id;
$themeInstallationVersion->theme_store_theme_id = $saasThemeConfig[$name]['id'];
$themeInstallationVersion->theme_store_theme_version_id = $saasThemeConfig[$name]['id'];
$themeInstallationVersion->save();
$themeInstallationTask = new ThemeInstallationTask();
$themeInstallationTask->theme_installation_id = $themeInstallation->id;
$themeInstallationTask->theme_installation_version_id = $themeInstallationVersion->id;
$themeInstallationTask->theme_store_theme_version_id = $saasThemeConfig[$name]['id'];
$themeInstallationTask->save();
DB::commit();
} catch(\Throwable $e) {
DB::rollBack();
throw $e;
}
3. When the transaction fails specially, the third model is inserted into a non-existent field, the transaction is rolled back, and the data is not inserted in the three tables. as shown in Figure 1
{
"message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'theme_store_theme_version_id' in 'field list' (SQL: insert into `theme_installation_task` (`processing`, `processing_failed`, `step`, `message`, `theme_installation_id`, `theme_installation_version_id`, `theme_store_theme_version_id`, `updated_at`, `created_at`) values (1, 0, 1, , 1, 1, 9, 2022-05-17 17:39:35, 2022-05-17 17:39:35))",
"code": "42S22",
"status_code": 500,
"debug": {
"line": 669,
"file": "\\.\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php",
"class": "Illuminate\\Database\\QueryException",
"trace": {
}
}
}
4. When the transaction is successful, confirm that all data are inserted into the three tables.
