すでに会員登録している人と同じID、同じメールアドレスが入力された場合、登録させないようにしたいシステムはいくつもあります。
従来であればSQLを実行して、同じIDやメールアドレスがないか存在チェックを行っていました。
Laravelであれば、バリデーションでちょっと記述するだけで簡単に存在チェックを行えます!
登録時に同じデータがあればエラーにできますし、登録情報の編集時に自分のデータを除外したりすることも簡単にできます。
実際にこの記事ではバリデーションを行ったファイルの紹介、行う上での注意点も紹介します。
IDの重複チェック【登録時】
IDの重複チェックは、次のバリデーションを使うだけです!
unique:テーブル名,カラム名
例えば入力フォームの「name」が「login_id」で、調べたいテーブル名が「managers」、カラム名が「login_id」だった場合は以下のように書きます。
$request->validate([
'login_id' => ['required','unique:managers,login_id']
]);
入力フォームの「name」と「カラム名」が一致していれば、省略も可能です。
省略する場合は以下のように記述します。
$request->validate([
'login_id' => ['required','unique:managers']
]);
注意しなければいけないのは、バリデーションの順番です。
IDの存在チェックは、他のバリデーションルールの一番最後に記述するのがポイント。
なぜなら、バリデーションは先頭に書かれているものから順番にチェックするからです。
「unique」はDBにアクセスして重複チェックをするので、他のバリデーションルールを通してからの実行が望ましいでしょう。
もし他のバリデーションルールを通さないでDBにアクセスしてしまうと、SQLインジェクションを起こしかねません。
「SQLインジェクション」とは、SQLコマンドを悪用してデータベースに不正にアクセスしたり攻撃したりする行為のことです。
非常に便利なバリデーションですが、使い方に気をつけましょう!
IDの重複チェック【編集時】
登録情報の編集時に自分のデータを除外したい場合は、以下のようなバリデーションになります。
unique:テーブル名,カラム名,除外ID,IDカラム名
例えば入力フォームの「name」が「login_id」で、調べたいテーブル名が「managers」、カラム名が「login_id」。除外したいIDが変数「$loginId」に入れている場合は以下のように書きます。
$request->validate([
'login_id' => ['required','unique:managers,login_id,' . $loginId . ',login_id']
]);
今回の場合も、バリデーションを最後に書くように気をつけましょう!
まとめ
IDの重複チェックをバリデーションで行う方法を紹介しました。
使うバリデーションは以下の「unique」です。
unique:テーブル名,カラム名
編集中のデータを除外したい場合は、以下のように書きます。
unique:テーブル名,カラム名,除外ID,IDカラム名
気をつける点は、バリデーションルールの中で一番最後に書くことです。
バリデーションは先頭からチェックが走ります。
もし最初にSQLを実行する「unique」のチェックが走ると、SQLインジェクションが起こりかねません。
注意点さえ押さえておけば、すごく便利なバリデーションですね!
以上に注意してバリデーションルール「unique」を活用しましょう!