如何验证在Laravel中更新它的用户的唯一电子邮件?

Lui*_*uiz 21 authentication validation laravel

我正在使用Laravel 5.2并希望使用验证器更新用户的帐户.

我想保持电子邮件字段的唯一性,但是,如果用户键入他当前的电子邮件,它将会中断.如果电子邮件是唯一的,除了用户自己当前的电子邮件之外,我该如何更新?

Ant*_*iro 56

你可以告诉验证者:

'email' => 'unique:users,email_address,'.$user->id
Run Code Online (Sandbox Code Playgroud)

检查文档,在"强制使用唯一规则忽略给定ID"部分中.

  • 仅供参考,在5.6.33版本中效果很好。`'email'=>'required | string | email | max:255 | unique:users,email,'。$ user-> id,` (3认同)

Afr*_*mad 20

在Request Class中,您可能需要在PUT或PATCH方法中进行此验证,如果您没有用户,则可以使用此规则

 You have 2 options to do this
Run Code Online (Sandbox Code Playgroud)

1:

 'email' => "unique:users,email,$this->id,id"
Run Code Online (Sandbox Code Playgroud)

要么

2:

 use Illuminate\Validation\Rule; //import Rule class 
'email' => Rule::unique('users')->ignore($this->id); //use it in PUT or PATCH method
Run Code Online (Sandbox Code Playgroud)

$ this-> id 提供用户的id,因为$ this是Request Class的对象,Request也包含user对象.

public function rules()
{
    switch ($this->method()) {
        case 'POST':
        {
            return [
                'name' => 'required',
                'email' => 'required|email|unique:users',
                'password' => 'required'
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'name' => 'required',
                'email' => "unique:users,email,$this->id,id",
                                   OR
                //below way will only work in Laravel ^5.5 
                'email' => Rule::unique('users')->ignore($this->id),

               //Sometimes you dont have id in $this object
               //then you can use route method to get object of model 
               //and then get the id or slug whatever you want like below:

              'email' => Rule::unique('users')->ignore($this->route()->user->id),
            ];
        }
        default: break;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望它能在使用请求类时解决问题.


Sal*_*lam 7

对于使用FormRequest& Laravel 5.7 并面临此问题的编码人员,您可以执行以下操作

public function rules() {

    return [
        'email' => ['required', 'string', 'email', 'max:255',
            Rule::unique('users')->ignore($this->user),
        ],
    ];

}
Run Code Online (Sandbox Code Playgroud)

$this->user会返回从请求传来的用户ID。


小智 7

'email' => "required|email|unique:users,email,$id",
Run Code Online (Sandbox Code Playgroud)

laravel 8 . 我也找了好久。这会起作用


小智 7

有很多方法:

1- 在控制器中

public function update(Request $request, User $user)
{
  $request->validate([
      'email' => 'required|email|unique:users,email,'.$user->id,
  ]);
}
Run Code Online (Sandbox Code Playgroud)

2-表格请求

表单请求是包含验证逻辑的自定义请求类。在这里阅读更多内容。

public function rules()
{
  return [
      'email' => 'required|email|unique:users,email,'.$this->user->id,
  ];
}
Run Code Online (Sandbox Code Playgroud)


Jua*_*rra 5

在 Laravel 5.7+ 上,为了指示验证器忽略用户 ID,我们将使用 Rule 类来流畅地定义规则。在这个例子中,我们还将验证规则指定为一个数组,而不是使用 | 分隔规则的字符:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => ['required',Rule::unique('users')->ignore($user->id)],
]);
Run Code Online (Sandbox Code Playgroud)

  • 确切地说,“$user”变量代表您要忽略的用户电子邮件,它可以是“auth()->user()”或“request('user_id')”,具体取决于您的项目。 (2认同)