もくじ
以前、バリデーションを行うにあたってFormRequestが便利という記事を投稿しました。
この中で、使用可能なバリデーションルールについてはあまりふれませんでした。
重複チェック自体はとても単純です。
単純な重複チェック
FormRequestクラスを継承したTestRequest
を作成しrulesに追記します。
class TestRequest extends FormRequest { /** * リクエストに適用するバリデーションルールを取得 * * @return array */ public function rules() { return [ 'name' => 'required|unique:tests,name', 'age' => 'required', 'sex' => 'required', ]; } /** * 定義済みバリデーションルールのエラーメッセージ取得 * * @return array */ public function messages() { return [ 'name.required' => '名前は必須です。', 'name.unique' => 'その名前は登録されています。', 'age.required' => '年齢は必須です。', 'sex.required' => '性別は必須です。', ]; } }
unique:tests,name
の部分で重複チェックを行なっています。
この場合、tests
テーブルのname
カラムに重複する値がないかをバリデーションチェックしています。
ちなみにバリデーションルールは|
(パイプ)でいくつも追加することができます。
自分以外の重複チェック
public function rules() { return [ 'name' => 'required|unique:tests,name,' . $this->id . ',id', // ★変更 'name' => 'required', 'age' => 'required', 'sex' => 'required', ]; }
★部分を変更します。
$this->id
とは自分自身のidです。そのidがDB上のidと同じレコードはバリデーション対象から外れます。
自分自身の重複チェックして論理削除されているレコードは除外
論理削除されているレコードは実際には存在するので、バリデーションチェックの重複チェックにおいても対象となってしまいます。
そこで、論理削除されているレコードを対象外にします。
public function rules() { return [ 'name' => 'required|unique:tests,name,' . $this->id . ',id,deleted_at,NULL', // ★変更 'name' => 'required', 'age' => 'required', 'sex' => 'required', ]; }
deleted_at
がNULL
のものの中からバリデーションチェックを行います。
論理削除する際にdeleted_at
カラムを用い 削除されていない場合は常にnullであることを利用しています。
くわしくはこちら。
論理削除されているレコードは除外
レコードの新規登録では自分自身というのはありませんが、論理削除されているレコードは対象外にしたいときもあります。
public function rules() { return [ 'name' => 'required|unique:tests,name,NULL,id,deleted_at,NULL', // ★変更 'name' => 'required', 'age' => 'required', 'sex' => 'required', ]; }
自分自身を検知する必要がないので、unique
の第3引数をNULLにすることで除外したいidを検知する必要がないようにします。
unique
の引数については下記が参考になります。
パラメータ
こちらを参考にさせていただきました!
【Laravel】 バリデーション - unique ルール(論理削除-SoftDeletes 対応) - Qiita
パラメータ | 内容 | 必須 | 備考 |
---|---|---|---|
第1 | テーブル名 | 必須 | - |
第2 | カラム | 必須 | - |
第3 | 除外データ | 除外したいデータがある場合は、必須 (データを編集の時など) |
デフォルトはIDのデータを記述する。 ※現時点では、論理削除に対応されていない |
第4 | 除外カラム名(デフォルトはID) | 下記の場合、必須 ・「除外データ(第3)」が「'テーブル(第1)'.’id’」以外 ・追加条件(第5を追加する) |
|
第5 | 追加条件のカラム(1) | 下記の場合、必須 ・論理削除に対応 ・条件を追加する |
deleted_at を追加または、 条件追加のカラム名 |
第6 | 追加条件の内容(1) | NULL を追加または、 条件追加の内容 |
|
第7 | 追加条件のカラム名(2) | ||
第8 | 追加条件の内容(2) |
参考URL
Laravelでuniqueの対象から自分自身の値を外す - Qiita