laravel 使用 DB 插入数据:事务不起作用
在使用数据库事务之前它正在工作 我以为验证中的问题但我认为它几乎是正确的 问题出在哪里..我第一次尝试使用事务
public function createDone(MainCategoryRequest $request){
try {
DB::beginTransaction();
// Insert new main category
$new_mainCategory = Category::create([
'slug' => $request->slug,
'is_active' => $request->is_active, // Use $is_active here
]);
if ($new_mainCategory) {
// Create category translations
CategoryTranslation::create([
'category_id' => $new_mainCategory->id,
'locale' => 'en',
'name' => $request->name_en,
]);
CategoryTranslation::create([
'category_id' => $new_mainCategory->id,
'locale' => 'ar',
'name' => $request->name_ar,
]);
}
// Commit the transaction
DB::commit();
// Return a success response
return response()->json(['message' => 'Category created successfully'], 201);
} catch (\Exception $e) {
// Something went wrong, rollback the transaction
DB::rollback();
// Handle the exception (log, return error response, etc.)
return response()->json(['error' => 'Failed to create category'], 500);
}
}
您可以对事务使用闭包,而不是显式调用
beginTransaction()
和 commit()
或 rollback()
。以下是如何重构代码以使用闭包并引发异常:
public function createDone(MainCategoryRequest $request) {
try {
DB::transaction(function () use ($request) {
// Insert new main category
$newMainCategory = Category::create([
'slug' => $request->slug,
'is_active' => $request->is_active,
]);
if (!$newMainCategory) {
throw new \Exception('Failed to create main category');
}
// Create category translations
$translations = [
['locale' => 'en', 'name' => $request->name_en],
['locale' => 'ar', 'name' => $request->name_ar]
];
foreach ($translations as $translation) {
CategoryTranslation::create([
'category_id' => $newMainCategory->id,
'locale' => $translation['locale'],
'name' => $translation['name'],
]);
}
} catch (\Exception $e) {
\Log::info($e->getMessage()); // logs an error in your log file
return response()->json(['error' => 'Failed to create category'],500);
}
}