uniqueバリデーション
Laravelで、テーブル内で特定のカラムの値がユニークであることを検証するためには、以下のようにunique:テーブル名、カラム名
と書くことができます。
// 例:'unique:users,email'でemailがusersテーブル内でユニークであることを検証
'email' => ['required', 'string', 'email', 'unique:users,email']
しかし、例えばプロフィールの編集でメールアドレスは変更せずにほかの情報を更新したい場合、上記の書き方ではメールアドレスの重複チェックに引っかかってしまうことがあります。
特定の値を重複チェックから除外する
この場合、Rule
クラスのignore
メソッドを使用することができます。
例えば以下のように$user->id
と指定することで、同じIDを持つデータのメールアドレスは重複チェックから除外されます。
use Illuminate\Validation\Rule;
'email' => ['required', 'email', Rule::unique('users')->ignore($user->id)],
セキュリティ上の注意
Laravel 11.x バリデーション
https://readouble.com/laravel/11.x/ja/validation.html
ユーザーがコントロールするリクエストの入力をignoreメソッドへ、決して渡してはいけません。代わりに、Eloquentモデルインスタンスの自動増分IDやUUIDのような、生成されたユニークなIDだけを渡してください。そうしなければ、アプリケーションがSQLインジェクション攻撃に対し、脆弱になります。
カラム名がid
でない場合
ignore
メソッドではデフォルトでid
カラムが無視されます。カラム名がid
でない場合、以下のように第二引数でカラム名を指定してあげる必要があります。
Rule::unique('users')->ignore($user->id, 'user_id')
さいごに
最後まで読んでいただき、ありがとうございました。
何かご不明点があれば、コメントしていただけると幸いです。
参考