【问题标题】:How to handle QueryException for duplicate entries in Laravel如何处理 Laravel 中重复条目的 QueryException
【发布时间】:2018-02-04 05:02:19
【问题描述】:

这是我试图处理 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 收到的任何回复。

得到错误:

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

【问题讨论】:

  • 在插入之前尝试验证信息。 laravel.com/docs/5.4/validation
  • 那部分很常见,有没有办法使用catch块处理重复异常?
  • 是的,有一些方法可以处理,但我建议使用验证,如果很常见,请拆分使用相同功能的程序。并针对每种情况首先进行验证
  • 无论如何你的代码都是正确的,除了命名空间异常的事实......它应该是 Illuminate\Database\QueryException

标签: php mysql laravel exception error-handling


【解决方案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】:

    你应该试试这个:

    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

    【讨论】:

    • 我在评论之前看到了那个帖子,我写了类似的代码,你将如何通过 throw 或 return 语句返回消息以及如何处理它?来自控制器还是模型本身?
    • @Mithun 让我检查一下
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      公共函数规则() {

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

      【讨论】:

        猜你喜欢
        • 2018-05-19
        • 1970-01-01
        • 2011-03-09
        • 2017-08-03
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        相关资源
        最近更新 更多