laravel 使用 DB 插入数据:事务不起作用

问题描述 投票:0回答:1

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);
    }
}
php laravel eloquent transactions laravel-8
1个回答
0
投票

您可以对事务使用闭包,而不是显式调用

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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.