Laravelで既存データをupdateするときは、更新前のデータはvalidation の uniqueルールから除外したい。
こういったときは ignoreを使いますが、うまくいかないことも。
応用編を交えつつ手順を解説するので、私と同じように悩んでいる方の参考になればうれしいです。
じゅんこ
地味ながら、ハマりました・・・・
カッコの付け方なども気を付けてくださいね。
Laravel 更新する時にuniqueもignoreも使わず簡単に処理する方法
前提条件
まずは前提条件から。
- ユーザー情報を更新するフォームを作成する
- 管理者が使うので、他のユーザー情報も更新する
- emailは重複がないようにしたい
認証済みユーザーが自分の情報を更新する場合の書き方は、本記事真ん中あたり、【ルールの書き方説明】で紹介しています。
フォームは次のような感じで作ります。
解決法
コントローラーのvalidationは次のように記述します。
(validationルールは別ファイルにせず、コントローラーの中に書く方法を採用しています。)
1 2 3 4 5 6 |
$inputs=request()->validate( [ 'name'=>'required|max:255', 'email'=>['required','email','max:255', Rule::unique('users')->ignore($user->id)], 'password'=>'required|confirmed|max:255|min:8', 'password_confirmation'=>'required|same:password' ]); |
全体のコードは次のとおりです。
ポイントは、下記3点。
- 最初にuse Ruleをきちんと記述しておく
- emailのuniqueルールの後に、ignoreをつけて、例外を記述する
- emailのvalidatoinで、配列のカッコを正しく入れる
ルールの書き方説明
書き方は、次の通り。
Rule::unique(‘テーブル名’)->ignore(テーブルの主キー)
上記のように書くことで、Laravelは次のように処理してくれます。
- 【テーブル名】をチェック
- バリデーションを行う項目と同じ名前のカラムは、情報が重複しないようにする
- ただし、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),
こういった応用ルールは公式マニュアルに掲載されています。
うまくコードがはまることを願ってます!