Laravel 检查约束冲突

2022-08-30 21:43:34

我很好奇是否有办法在删除或插入记录到数据库中时检查是否存在约束冲突错误。

引发的异常称为“QueryException”,但这可能是各种各样的错误。如果我们能检查异常的具体错误是什么,那就太好了。


答案 1

您正在寻找 .如果你看一下QueryException类,它从PDOException扩展而来,因此你可以访问变量。23000 Error code (Integrity Constraint Violation)$errorInfo

要捕获此错误,您可以尝试:

try {
  // ...

} catch (\Illuminate\Database\QueryException $e) {
    var_dump($e->errorInfo);
}

// Example output from MySQL
array (size=3)
   0 => string '23000' (length=5)
   1 => int 1452
   2 => string 'Cannot add or update a child row: a foreign key constraint fails (...)'

更具体地说(重复条目,而不是空,添加/更新子行,删除父行...),这取决于每个DBMS:

对于laravel,处理错误很容易,只需将此代码添加到“app/start/global.php”文件中(或创建服务提供商):

App::error(function(\Illuminate\Database\QueryException $exception)
{
    $error = $exception->errorInfo;
    // add your business logic
});

答案 2

首先把它放在你的控制器里

use Exception;

第二个使用 try catch 处理错误,如本例所示

try{    //here trying to update email and phone in db which are unique values
        DB::table('users')
            ->where('role_id',1)
            ->update($edit);
        return redirect("admin/update_profile")
               ->with('update','update');
            }catch(Exception $e){
             //if email or phone exist before in db redirect with error messages
                return redirect()->back()->with('phone_email','phone_email_exist before');
            }

此处的新更新无需使用 try catch,您可以在验证规则中轻松执行此操作,因为以下代码会爆炸

public function update(Request $request, $id)
{
    $profile = request()->all();
    $rules    = [
            'name'                       => 'required|unique:users,id,'.$id,
            'email'                      => 'required|email|unique:users,id,'.$id,
            'phone'                      => 'required|unique:users,id,'.$id,
    ];
    $validator = Validator::make($profile,$rules);
    if ($validator->fails()){
        return redirect()->back()->withInput($profile)->withErrors($validator);
    }else{
        if(!empty($profile['password'])){
            $save['password'] = bcrypt($profile['password']);
        }
        $save['name']                  = $profile['name'];
        $save['email']                 = $profile['email'];
        $save['phone']                 = $profile['phone'];
        $save['remember_token']        = $profile['_token'];
        $save['updated_at']            = Carbon::now();

        DB::table('users')->where('id',$id)->update($save);
        return redirect()->back()->with('update','update');
    }
}

其中id与您编辑的记录相关。


推荐