新たにルールを作成してvalidationを作成しよう
通常のvalidation
やりたかったこと
新しいルールの作成
・ルールの記載
・エラーメッセージの作成
validationに追加
通常のvalidation
public function rules()
{
return [
'email' => 'required|unique:users,email',
];
}
上記例では単純に
1.メールアドレスが必須かどうか?
2.メールアドレスがusersテーブルですでに使用されているメールアドレスではないか?
これで本当に単純なvalidationが完了です!
やりたかったこと
ここからが自分のやりたかったことです。
仮登録ユーザーはメールアドレスのユニークチェックを行わないようにしたかったのです。
機能上どうかとは思いますが。。。
その辺りは無視してください。
今回はあくまでも新しいルールを作成することのみ説明しています。
本登録状態のデータはroleを仮登録の1としておきます。
仮登録状態のデータはroleを仮登録の9としておきます。
usersテーブル
name | email | role
hoge | test@test.com | 9
このような場合にはユニークチェックを行わず登録ができるようにすると言うことです。
単純に追加するとこのようになります。
usersテーブル
name | email | role
hoge | test@test.com | 9
hoge | test@test.com | 9
そして本登録が完了したらroleの値を1に変更しユニークチェックを走らせます。
usersテーブル
name | email | role
hoge | test@test.com | 9
hoge | test@test.com | 1
この状態でtest@test.comを登録しようとしてもエラーになると言うことです。
新しいルールの作成
まずは
$ php artisan make:rule NewRule
Rule created successfully.
新たにApp\Rules以下にルールを作成するファイルが作成されます。
作成されたファイル
NewRule.php
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class NewRule implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
//
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The validation error message.';
}
}
新たにできたファイルの中身がこちらです。
ルールの記載
public function passes($attribute, $value)
{
$res = User::getCountEmailByEmail($value);
if($res === 0){
return true;
}
return false;
}
それではコードの説明をしていきます。
passes($attribute, $value)
$attribute:フィールド名が入ります。
ここではemailが入ってきます。
$value:値が入ります。
ここではtest@test.comが入ってきます。
$res = User::getCountEmailByEmail($value);
User::getCountByEmail($value)
Userモデルにて
return User::where('email', $email)->where('role' ,'<>' ,'9')->get()->count();
roleが9以外でtest@test.comに一致するデータのレコード数を取得しています。
if($res === 0){
return true;
}
return false;
こちらでレコード数が0ならtrue、それ以外ならfalse
falseのときにエラーが発生します。
エラーメッセージの作成
public function message()
{
return 'すでに登録されているメールアドレスです。';
}
これで上記にエラーが返されます。
validationに追加
public function rules()
{
return [
'email' => 'required|unique:users,email,new NewRule',
];
}
,new NewRule
を追加しています。
これで完了です。