尽管在 Laravel 5 中使用唯一验证,但字段重复

Duplicate fields despite using unique validation in Laravel 5

在 Laravel 我有一个 API 允许用户注册。

注册有一个简单的电子邮件验证是唯一的,看起来像这样:

public function register(Request $request) {
    $this->validate($request, [
        'email' => 'required|email|unique:users|max:255',
        'password' => 'required|min:6|max:50',
    ]);

    // create new user and save model
}

不幸的是,我仍然在我的 table 中发现相当多的用户有重复的电子邮件。

我认为这是因为我的应用有时会连续多次发送相同的请求。这意味着两个请求都通过了验证,尽管它们具有相同的电子邮件,因为它们尚未添加到数据库中。

如何解决此问题以确保电子邮件的唯一性?

您可以在实际插入数据时使用 try-catch block(有关更多信息,请参阅 PHP Manual):

try {
  $connection->query(<yourInsertquery>);
  return true;
} catch (PDOException $e){
  if ($e->getCode() == 1062){
    return 'duplicate';
  }
  return false;
}

有了这个,只要你有重复的条目,你就会得到一个字符串 'duplicate' ,否则 false 如果出现不同的错误, true

或者通过禁用客户端的提交按钮来简单地防止多次提交相同的表单...您不太可能从同时提交的两个会话中获得相同的电子邮件地址...

   $(document).ready(function () {

        $('#button').click(function () {
            $('#button').attr('disabled', true);
            $('#Form').submit();
            return true;
        });

    });

您可以通过为表单生成令牌并将该令牌保存到会话中来做类似此服务器端的操作,将表单锁定为仅提交一次...有多种方法可以给猫蒙皮。以前的答案也有效,但你需要往返数据库......这个没有性能损失(虽然这是一个边缘案例,应该可以忽略不计......)

希望对您有所帮助

像这个例子一样在您的输入验证中使用这个自定义函数

   $validator = Validator::make(Input::all(), [

            'name' => 'required',
            'email' => [
                'required',
                'email',
                    function ($attribute, $value, $fail) {
                        if (Employee::where('email',$value)->count() > 0) {
                            $fail($attribute.'already exits');
                        }
                    },
            ],
        ]);