0
2

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】複数条件でvalidation

Posted at

新たにルールを作成して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
を追加しています。

これで完了です。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?