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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/45893359/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 16:33:10  来源:igfitidea点击:

How to handle QueryException for duplicate entries in Laravel

phpmysqllaravelexceptionerror-handling

提问by Mithun Shreevatsa

Here is my model code trying to handle duplicate entries:

这是我尝试处理的模型代码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');
            }
        }
    }

Calling controller code looks like: $userModel->addUser($userData);

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

Here I am not trying to print any response received from model.

在这里,我不是要打印从model.

Getting error as:

获取错误为:

enter image description here

在此处输入图片说明

What am I doing wrong? How to handle Exceptions correctly and what's the best practise of doing it?

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

回答by Mithun Shreevatsa

I was very near to my answer, it was all about namespaceissue and error display issue:

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

Illuminate\Database\QueryException $eshould be: \Illuminate\Database\QueryException $e

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');
            }
        }

returnand throwfor error did not work, but 'dd' method worked. So this saves my time in querying twice to identify the duplicates and insert and am happy for it :)

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

回答by AddWeb Solution Pvt Ltd

You should try this:

你应该试试这个:

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';
    }
  }
}

For more details, please follow this link.

欲了解更多详情,请点击此链接

回答by Waiyl Karim

If you just want to avoid the duplicate entry exception without having to wrap everything between try{} catch{}, you could simply use Laravel's firstOrCreate()method as follows:

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

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

Using this method assumes that you are calling protected $guarded = []on your User model.

使用此方法假定您正在调用protected $guarded = []您的 User 模型。