【Laravel/MySQL】FormRequestを使って重複チェック

もくじ

以前、バリデーションを行うにあたってFormRequestが便利という記事を投稿しました。

この中で、使用可能なバリデーションルールについてはあまりふれませんでした。

bonoponz.hatenablog.com

バリデーション 7.x Laravel

重複チェック自体はとても単純です。

単純な重複チェック

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_atNULLのものの中からバリデーションチェックを行います。

論理削除する際にdeleted_atカラムを用い 削除されていない場合は常にnullであることを利用しています。

くわしくはこちら。

bonoponz.hatenablog.com

論理削除されているレコードは除外

レコードの新規登録では自分自身というのはありませんが、論理削除されているレコードは対象外にしたいときもあります。

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

バリデーション 7.x Laravel

Laravelでuniqueの対象から自分自身の値を外す - Qiita

【Laravel】 バリデーション - unique ルール(論理削除-SoftDeletes 対応) - Qiita

Laravel の unique ルールとソフトデリート - localdisk