如何在Laravel中处理重复条目的QueryException

时间:2017-08-26 08:11:53

标签: php mysql laravel exception error-handling

这是我的模型代码试图处理duplicate entries

$userData = ['name' => $name, 'email' => $email, 'password' => $password]; 

   public function addUser($userData) {     
        try {
            DB::table('users')->insert($userData);
        } catch (QueryException $e) {
            $errorCode = $e->errorInfo[1];          
            if($errorCode == 1062){
                throw ('Duplicate Entry');
            }
        }
    }

调用控制器代码如下:$userModel->addUser($userData);

此处我不打算打印从model收到的任何回复。

获取错误:

enter image description here

我做错了什么?如何正确处理异常以及这样做的最佳做法是什么?

4 个答案:

答案 0 :(得分:1)

你应该试试这个:

public function addUser($userData) 
{     
  try {
    DB::table('users')->insert($userData);
  } catch (Illuminate\Database\QueryException $e){
    $errorCode = $e->errorInfo[1];
    if($errorCode == 1062){
        return 'Duplicate Entry';
    }
  }
}

有关详情,请按此link

答案 1 :(得分:1)

我非常接近我的回答,这完全是关于namespace问题和错误显示问题:

Illuminate\Database\QueryException $e应该是:   \Illuminate\Database\QueryException $e

        try {
            DB::table('users')->insert($userData);  
        } catch(\Illuminate\Database\QueryException $e){
            $errorCode = $e->errorInfo[1];
            if($errorCode == '1062'){
                dd('Duplicate Entry');
            }
        }

returnthrow错误无效,但'dd'方法有效。这样可以节省我两次查询重复项并插入的时间,并为此感到高兴:)

答案 2 :(得分:0)

如果您只是想避免重复输入异常而不必在try{} catch{}之间包装所有内容,则可以简单地使用Laravel的firstOrCreate()方法,如下所示:

User::firstOrCreate([
    'email' => $request->email // unique field here
], $userData);

使用此方法假定您正在用户模型上调用protected $guarded = []

答案 3 :(得分:0)

公共函数规则(){

    return [
                    
        'tool_id' => ['required','integer','unique:assign_toolto_joborders'],
        'joborder_id' => ['required','integer'],
        'assign_date' => ['required','date_format:d-m-Y'],
        'tool_qty' => ['required','integer']
        
    ];
}