鶏口牛後な日々 〜へっぽこPHPエンジニアの発散の記録〜

PHPエンジニアを目指して奮闘中、でもブログは発散中

Laravelのedit/updateフォームでvalidationから1レコードだけ除外する

ユーザー情報の登録について、アップデートしたい場合に、登録時に例えばメールアドレスにバリデーションで unique をつけていた時、アップデート時は、そのメールアドレスはすでにその人のレコードではあるので、ユニークバリデーションから除外したい時ってありますよね。

でも、他の人のメールアドレスとは被らないことをチェックしてほしい。

そういう時は、uniqueルールの引数で、ignore(無視)するレコードを指定することができます。

バリデーションのリクエストファイルの、rulesのところに以下のように書きます。

$user = $this->route('user');
return [
     'email' => 'unique:users,email,'.$user->id,
];

この時、 $this->route('user') というのは、このリクエストファイルに到達するときのルート(=updateメソッドを呼び出すルート)に含まれているルートパラメータのuserというのを取得しています。 これによって、 $user->id というのは、今編集しているレコードのidを示すことができて、このレコードをバリデーションのuniqueルールから除外してくれる、という寸法です。

ちなみに、こちらはバージョン5.3あたりから、新しいカスタムバリデーション的なものを作成する方法に変わってしまったのですが、 以前の書き方の方がシンプルだし、少なくとも2018年5月現在もまだ上記のやり方が通用することを確認しています。

以上。

参考:5.2の公式ドキュメント