1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelでemailが他人と重複していた時に登録できないようにするには

Posted at

この記事の背景

Laravelでユーザー編集画面を作っていた時に実装したことです。
バリデーションの設定をする時にemailを設定していました。

UserRequest.php
public function rules()
    {
        return [
            #省略,
            'email' => [
                'required', 'string', 'email', 'max:255']
            #省略,
        ];
    }
}

しかしこれだとemailが他人と重複していても登録できてしまいます。
アドレスがわかったら勝手にログインされて勝手に他人に編集されたりします。

解決法

下のコードを追記します。

Rule::unique('users')->ignore($this->id)

これはLaravelフレームワークのバリデーションルールです。

Chat GPIより参照   これは、「table_name」という名前のデータベーステーブルにおいて、特定のIDを持つレコードを除いて、指定されたカラムの値が一意であることを検証するために使用されます。具体的には、ignore($this->id)は、バリデーション中に現在のモデルインスタンス(例えば、フォーム送信時に更新されるユーザープロファイル)を除外するために使用されます。つまり、同じ「table_name」テーブル内で、そのカラムの値が他のレコードと重複することを検証するために使用されますが、現在のモデルインスタンス自体は重複を検証しないようになります。

コードにするとこうなります。

UserRequest.php
public function rules()
    {
        return [
            #省略
            'email' => [
                'required', 'string', 'email', 'max:255',Rule::unique('users')->ignore($this->id)
            ],
            #省略
        ];
    }

バリデーション のテストしてみたらログイン時に登録済みのユーザーはログインできなくなりました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?