Laravel 5.2を使用しており、バリデーターを使用してユーザーのアカウントを更新したい。
メールフィールドを一意に保ちたいのですが、ユーザーが現在のメールを入力すると壊れてしまいます。電子メールが一意である場合、ユーザー自身の現在の電子メールを除き、どのように更新できますか?
あなたはそれをバリデータに伝えることができます:
'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;
}
}
要求クラスの使用中に問題が解決されることを願っています。
Laravel 5.7でバリデーターにユーザーのIDを無視するよう指示する場合、Ruleクラスを使用してルールを流に定義します。この例では、検証ルールを配列として指定しますルールを区切るために|文字を使用する代わりに:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
FormRequest
&Laravel 5.7を使用し、この問題に直面しているコーダーの場合、次のようなことができます。
public function rules() {
return [
'email' => ['required', 'string', 'email', 'max:255',
Rule::unique('users')->ignore($this->user),
],
];
}
$this->user
は、リクエストからのユーザーIDを返します。
フォームリクエストを作成し、このコードを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'
];
}
ドキュメントを確認する こちら