更新セクションに一意の検証ルールがあります。
一意のルールを挿入または追加する場合は'Email' => array('unique:driver_details'),
であり、一意の列をチェックします。
しかし、これは更新セクションでは失敗します。更新中は他のルールを満たし、電子メールの一意性において、一意の列をチェックし、失敗しますが、独自のフィールドを確認します。
だから、どうすればデータベース内の独自の値を除いて一意をチェックできますか?
これにより、特定のIDが無視されます。
'email' => 'unique:table,email_column_to_check,id_to_ignore'
セグメントを置き換えるtable
、email_column_to_check
、id_to_ignore
上記の例
ここで確認できます http://laravel.com/docs/4.2/validation#rule-unique
Laravel 5およびフォームリクエストを使用する場合、ルートモデルバインディングのモデルのIDを$this->name_of_the_model->id
としてフォームリクエストのプロパティとして直接取得し、それを使用できます。一意のルールから無視します。
たとえば、独自のメールを使用したいが、管理者がユーザーを編集できるようにするには、次のようにします。
ルート:
Route::patch('users/{user}', 'UserController@update');
コントローラ:
public function update(UserRequest $request, User $user)
{
// ...
}
フォームのリクエスト:
class UserRequest extends FormRequest
{
// ...
public function rules()
{
return [
'name' => 'required|string',
'email' => [
'required',
'email',
Rule::unique('users')->ignore($this->user->id, 'id')
],
//...
];
}
//...
}
編集中のユーザーは無視されることに注意してください。この場合、認証されたユーザーとは異なる可能性があります。
ルールを書いて含める
use Illuminate\Validation\Rule;
次のように検証コードを記述します。
'Email' => [required,
Rule::unique('driver_details')->ignore($id),
]
ここで$ idは、コントローラーから取得される、検証中に無視する電子メールのIDです。
私はLaravel 5.2を使用しています
主キーの名前が 'id'の場合、テーブル名はusers_tableであり、user_nameを更新したいので、このようにします
'user_name' => 'required|unique:users_table,user_name,'.$id
主キーの名前が「id」ではない場合、私の場合、主キーはuser_idで、テーブル名はusers_tableであり、user_nameを更新します。
だから私はこのようにします
'user_name' => 'required|unique:users_table,user_name,'.$id.',user_id'
$request->validate([
'email' => 'unique:table_name,email,' . $user->id
]);
これには少し時間がかかりましたが、更新/作成リクエストを処理しているときは、リクエストオブジェクトにもアクセスできます。ここでは、クライアント名が一意であることを強制していますが、現在編集中のクライアントを許可しています。
class CreateUpdateClientRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => [
'required',
'string',
'min:3',
'max:50',
Rule::unique('clients')->ignore($this->request->get('id'))
],
'primary_contact_name' => 'required|string|min:3|max:50',
'primary_contact_email' => 'required|string|email|min:5|max:50',
'primary_contact_phone' => 'nullable|string|min:5|max:50',
'secondary_contact_name' => 'nullable|string|min:3|max:50',
'secondary_contact_email' => 'nullable|string|email|min:5|max:50',
'secondary_contact_phone' => 'nullable|string|min:5|max:50',
'notes' => 'nullable'
];
}
}
これを試して
'email' => 'unique:table_name,column_name,'.$this->id.',id'
$this->id
はリクエストの値になります
しばらくの間、この問題に直面しています。これを試して:
$v = Validator::make($request->all(), [
'email' => ['required',
Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
]
]);
Laravel 5.8で動作します。Laravelの下位バージョンで動作するかどうかはわかりません。
Laravel 6アプリでは、現在のユーザーのメールを検証から除外するのに役立ちました:
use Illuminate\Validation\Rule;
public function update(Request $request, $id)
{
$request->validate([
'email' => [
'email',
'required',
Rule::unique('claims')->ignore($id),
],
]);
// ...
}