update時にunique validationから更新前のデータを除外する方法【Laravel】

Laravel・PHP豆知識・トラブル対策

Laravelで既存データをupdateするときは、更新前のデータはvalidation の uniqueルールから除外したい。

こういったときは ignoreを使いますが、うまくいかないことも。

応用編を交えつつ手順を解説するので、私と同じように悩んでいる方の参考になればうれしいです。

じゅんこ
じゅんこ

地味ながら、ハマりました・・・・

カッコの付け方なども気を付けてくださいね。

Laravel 更新する時にuniqueもignoreも使わず簡単に処理する方法

前提条件

まずは前提条件から。

  • ユーザー情報を更新するフォームを作成する
  • 管理者が使うので、他のユーザー情報も更新する
  • emailは重複がないようにしたい

認証済みユーザーが自分の情報を更新する場合の書き方は、本記事真ん中あたり、【ルールの書き方説明】で紹介しています。

フォームは次のような感じで作ります。

解決法

コントローラーのvalidationは次のように記述します。

(validationルールは別ファイルにせず、コントローラーの中に書く方法を採用しています。)

全体のコードは次のとおりです。

ポイントは、下記3点。

  • 最初にuse Ruleをきちんと記述しておく
  • emailのuniqueルールの後に、ignoreをつけて、例外を記述する
  • emailのvalidatoinで、配列のカッコを正しく入れる

ルールの書き方説明

書き方は、次の通り。

Rule::unique(‘テーブル名’)->ignore(テーブルの主キー)

上記のように書くことで、Laravelは次のように処理してくれます。

  1. 【テーブル名】をチェック
  2. バリデーションを行う項目と同じ名前のカラムは、情報が重複しないようにする
  3. ただし、ignoreのあとに指定した項目はルールから除外する

上記の例に当てはまらない場合の書き方

上記のシチュエーションに当てはまらない場合の書き方を3つほど紹介します。

ログイン後のユーザーが操作を行う場合

もしログインしている認証済みユーザーが操作を行う場合、このユーザーだけをルールから除外するには、下記のように書けます。

‘email’=>[‘required’,’email’,’max:255′, Rule::unique(‘users’)->ignore(Auth::id())]

主キー名がidではない場合

usersテーブルの主キーの名前が【id】ではなく、【user_id】であれば、次のようにignoreの2つ目の引数に入れます。

Rule::unique(‘users’)->ignore($user->id, ‘user_id’)

バリデーション項目とテーブルのカラム名が違う場合

もしもバリデーションを行う項目と、テーブルのカラム名が一致していない場合には、uniqueの2つ目の引数にテーブルのカラム名を入れます。

Rule::unique(‘users’, ‘email_address’)->ignore($user->id),

こういった応用ルールは公式マニュアルに掲載されています。

うまくコードがはまることを願ってます!

コメント

タイトルとURLをコピーしました