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

时间:2017-03-13 11:23:08

标签: php mysql laravel laravel-5 laravel-validation

在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
}

不幸的是,我仍然在我的桌面上发现了一些重复电子邮件的用户。

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

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

3 个答案:

答案 0 :(得分:1)

您可以在实际插入数据时使用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

答案 1 :(得分:0)

在此示例的输入验证中使用此自定义功能

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

答案 2 :(得分:-1)

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

   $(document).ready(function () {

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

    });

您可以通过为表单生成令牌并将该令牌保存到仅形成一个提交的会话锁定来执行此类服务器端之类的操作...许多方法可以将该表格剥离。上一个答案也可以,但你需要往返数据库...这个没有性能损失(虽然这是一个边缘情况,应该是可以忽略的......)

希望这有帮助