返回

解决 Laravel DB 事务中数据插入失败的问题

php

使用 Laravel DB 事务实现可靠的数据插入

问题陈述

在使用 Laravel 的数据库事务之前,代码可以正常运行。但是在引入事务后,数据插入失败,提示错误信息。深入调查后,发现问题出在验证逻辑中。

解决方法

问题的原因在于错误使用了 request->is_active 变量。在创建主类别时,应该使用 is_active 布尔值,但代码中使用的是 $request->is_active,这是来自请求的一个字符串。

request->is_active 替换为 is_active 后,错误得到解决,数据插入成功。

代码优化

除了修复错误,还建议对代码进行一些优化:

  • 使用 $request->validated() 获取经过验证的数据: 这确保数据已通过所有验证规则,避免潜在错误。
  • 使用命名绑定构建查询: 这可以防止 SQL 注入攻击,并使代码更易于阅读和维护。

完整代码

public function createDone(MainCategoryRequest $request)
{
    try {
        DB::beginTransaction();
        
        // 创建主类别
        $new_mainCategory = Category::create([
            'slug' => $request->slug,
            'is_active' => $request->validated()['is_active'],
        ]);
        
        if ($new_mainCategory) {
            // 创建类别翻译
            CategoryTranslation::create([
                'category_id' => $new_mainCategory->id,
                'locale' => 'en',
                'name' => $request->validated()['name_en'],
            ]);
            
            CategoryTranslation::create([
                'category_id' => $new_mainCategory->id,
                'locale' => 'ar',
                'name' => $request->validated()['name_ar'],
            ]);
        }
        
        // 提交事务
        DB::commit();
        
        // 返回成功响应
        return response()->json(['message' => 'Category created successfully'], 201);
    } catch (\Exception $e) {
        // 回滚事务
        DB::rollback();
        
        // 处理异常
        return response()->json(['error' => 'Failed to create category'], 500);
    }
}

结论

通过使用 Laravel DB 事务,我们可以确保在需要多个步骤才能完成的操作(例如创建和更新多条记录)中,所有操作要么全部成功,要么全部失败。

常见问题解答

  1. 什么是数据库事务?
    数据库事务是一组数据库操作,要么全部成功,要么全部失败。

  2. 为什么使用数据库事务?
    事务用于确保数据一致性和完整性,尤其是在需要多个步骤才能完成的操作中。

  3. 在 Laravel 中如何使用事务?
    使用 DB::beginTransaction() 启动事务,在事务中执行操作,然后使用 DB::commit() 或 DB::rollback() 提交或回滚事务。

  4. 什么是命名绑定?
    命名绑定是一种查询参数化技术,可防止 SQL 注入攻击并提高代码的可读性。

  5. 如何使用 $request->validated() 函数?
    $request->validated() 函数获取经过验证的请求数据,确保数据符合所有验证规则。