1. Using database transactions in Laravel 6’s Eloquent ORM. The application only uses PHP 7.0 and later, so \Exception is replaced 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
PHP
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 deliberately causing the transaction to fail—that is, by inserting a non-existent field into the third model—the transaction rolls back, confirming that no data was inserted into any of the three tables. See Figure 1

JSON
{
"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. After the transaction succeeds, confirm that data has been inserted into all three tables.
