LoginSignup
1
2

More than 1 year has passed since last update.

LaravelのRequestを使ったuniqueバリデーションで自分自身を除く方法

Last updated at Posted at 2021-10-09

こんにちは、JeffTechです。

説明

Laravelのユーザー情報編集のRequestにて、メールアドレスをunique設定しました。

しかし、メールアドレスを変更せずに他の項目を変更し、編集ボタンをクリックすると「すでにこのメールアドレスが登録されています」とのバリデーションが出てしまいました。

理由は簡単で、自身のメールアドレスがすでにDBへ登録されているため、Laravel側で重複していると判断されてしまったためです。

今回はその解決法を説明します。

この記事で実現できること

  • Requestにて自分自身を除く方法

実装

今回はUsersテーブルのカラム名がemailであるパターンで説明していきます。

unique:ユニークチェックをしたいテーブル名,ユニークチェックをしたいカラム名,ユニークチェックを除外したい値,ユニークチェックを除外したいカラム名
という感じで記述していきます。

ログインユーザーのメールアドレスを重複バリデーションから除きたい場合

UserUpdateRequest.php
<?php

namespace App\Http\Requests\Admin;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;

class UserUpdateRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            'name' => ['required', 'between:2,150'],
            'email' => ['required', 'string', 'email:strict,dns', 'max:255', 'unique:users,email,'.Auth::user()->email.',email'],
            'support_end_at' => ['required', 'date', 'date_format:Y-m-d'],
        ];
    }
}

ログインユーザーのメールアドレスを重複バリデーションから除きたい場合は、

  • ユニークチェックをしたいテーブル名:users
  • ユニークチェックをしたいカラム名:email
  • ユニークチェックを除外したい値:Auth::user()->email
  • ユニークチェックを除外したいカラム名:email
    となります。

ちなみに、Auth::user()->emailとすることで、ログインユーザーのメールアドレスを取得できます。

管理画面などで、ユーザー一覧から選択したユーザーのメールアドレスを重複バリデーションから除きたい場合

UserUpdateRequest.php
<?php

namespace App\Http\Requests\Admin;

use App\Models\User;
use Illuminate\Foundation\Http\FormRequest;

class UserUpdateRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        $user = User::find($this->id);
        return [
            'name' => ['required', 'between:2,150'],
            'email' => ['required', 'string', 'email:strict,dns', 'max:255', 'unique:users,email,'.$user->email.',email'],
            'support_end_at' => ['required', 'date', 'date_format:Y-m-d'],
        ];
    }
}

一方で、管理画面などで、ユーザー一覧から選択したユーザーのメールアドレスを重複バリデーションから除きたい場合は、

  • ユニークチェックをしたいテーブル名:users
  • ユニークチェックをしたいカラム名:email
  • ユニークチェックを除外したい値:$user->email
  • ユニークチェックを除外したいカラム名:email
    となります。

まず、$user = User::find($this->id);で選択したユーザーの情報を変数$userに格納します。
その後、そのユーザーのメールアドレス情報を$user->emailで取得します。

最後に

少しでも役に立った!という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね!
https://twitter.com/jefftechsaku

1
2
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
2