こんにちは、JeffTechです。
説明
Laravelのユーザー情報編集のRequestにて、メールアドレスをunique設定しました。
しかし、メールアドレスを変更せずに他の項目を変更し、編集ボタンをクリックすると「すでにこのメールアドレスが登録されています」とのバリデーションが出てしまいました。
理由は簡単で、自身のメールアドレスがすでにDBへ登録されているため、Laravel側で重複していると判断されてしまったためです。
今回はその解決法を説明します。
この記事で実現できること
- Requestにて自分自身を除く方法
実装
今回はUsersテーブル
のカラム名がemail
であるパターンで説明していきます。
unique:ユニークチェックをしたいテーブル名,ユニークチェックをしたいカラム名,ユニークチェックを除外したい値,ユニークチェックを除外したいカラム名
という感じで記述していきます。
ログインユーザーのメールアドレスを重複バリデーションから除きたい場合
<?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
とすることで、ログインユーザーのメールアドレスを取得できます。
管理画面などで、ユーザー一覧から選択したユーザーのメールアドレスを重複バリデーションから除きたい場合
<?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