0
0

Laravelのuniqueバリデーションで特定の値を除外する

Posted at

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')

さいごに

最後まで読んでいただき、ありがとうございました。
何かご不明点があれば、コメントしていただけると幸いです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0