web-dev-qa-db-ja.com

Laravelでそれを更新しているユーザーからの一意の電子メールをどのように検証しますか?

Laravel 5.2を使用しており、バリデーターを使用してユーザーのアカウントを更新したい。

メールフィールドを一意に保ちたいのですが、ユーザーが現在のメールを入力すると壊れてしまいます。電子メールが一意である場合、ユーザー自身の現在の電子メールを除き、どのように更新できますか?

20
Luiz

あなたはそれをバリデータに伝えることができます:

'email' => 'unique:users,email_address,'.$user->id

「一意のルールに特定のIDを無視させる」セクションの docs を確認してください。

リクエストクラスでは、おそらくユーザーがいないPUTまたはPATCHメソッドでこの検証が必要になるので、このルールを使用するだけです

 You have 2 options to do this

1:

 'email' => "unique:users,email,$this->id,id"

OR

2:

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

$ this-> idはユーザーのIDを提供しています。これは、$ thisがリクエストクラスのオブジェクトであり、リクエストにはユーザーオブジェクトも含まれているためです。

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

要求クラスの使用中に問題が解決されることを願っています。

16
Afraz Ahmad

Laravel 5.7でバリデーターにユーザーのIDを無視するよう指示する場合、Ruleクラスを使用してルールを流に定義します。この例では、検証ルールを配列として指定しますルールを区切るために|文字を使用する代わりに:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
         Rule::unique('users')->ignore($user->id),
    ],
]);
1

FormRequest&Laravel 5.7を使用し、この問題に直面しているコーダーの場合、次のようなことができます。

public function rules() {

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

}

$this->userは、リクエストからのユーザーIDを返します。

1
Salam

フォームリクエストを作成し、このコードをApp/Http/Request/YourFormRequestクラスに追加します

public function rules()
{  // get user by uri segment
   $user = User::find((int) request()->segment(2)); 
   return [ 
        'name' => 'required|string|max:100', 
        'email' => 'required|email|unique:users,email,'.$user->id.',id' 
    ];
}

ドキュメントを確認する こちら

0
silvia zulinka