【Laravel8.x】バリデーションでwhere節を使う。

Laravel

今回はバリデーションで追加ルールとしてWHERE節を使ってみようと思います。

バリエーションの内容

今回は公式を見て参考にさせていただきました↓

バリデーション
[https://readouble.com/laravel/8.x/ja/validation.html]

ではいきましょう。

今回バリデーションしたい内容としては以下です。

  • ユーザーが存在しているのかどうか
  • ユーザーが認証されているのかどうか

この2つの内容をチェックしようと思います。

tableの中身

チェックしたいテーブルの中身は以下のようにしましょう。

php artisan make:migration create_test_users_table

個々で注意したいのはテーブルの名前は複数にするということです。

フレームワークは命名規則に依存することが多いので要注意。

じゃあmigrationファイルをいじって....

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateClientsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('test_users', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            $table->string('name')->comment('ユーザ名');
            $table->string('furigana')->comment('ユーザフリガナ');
            $table->string('email')->unique()->comment('メールアドレス');
            $table->string('tell')->comment('電話番号');
            $table->tinyInteger('is_certificated')->comment('認証されているかどうか');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('test_users');
    }
}
 php artisan migrate

エラーは無いはず!

じゃあ次はバリデーションの中身書いてみる。

バリデーション

じゃあバリデーションは以下のように書いてみますね。

<?php

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class hogeController extends Controller
{
    public function hogehoge(Request $request)

    $request->validate([
        'email' => [
            Rule::exists('test_users')->where(function ($query) {
                return $query->where('is_certificated', true);
            }),
        ],
    ]);
}

内容を説明すると、まずuseでバリデーションに必要なものを呼び出します。

そこからバリデーションですね!requestでフロントから受けとった値をバリデートしていきます。

バリデーション1

Rule::exists('test_users')
test_usersテーブルの中に$request['email'](メールアドレス)は存在するのかをチェック。

バリデーション2

->where(function ($query) {
return $query->where('is_certificated', true);
}),
さっきチェックしたメールアドレスのユーザーはtest_usersテーブルのis_certificatedカラムの値はtrueかどうかをチェック。

この2つを合わせて目的のバリデーションをかけます!

こんな感じでwhereを使うことができます!

意外と簡単ですねえ。。。

ちなみに公式では以下のように紹介されています!! ↓↓↓↓

追加のWHERE節を付け加える
whereメソッドを使用してクエリをカスタマイズすることにより、追加のクエリ条件を指定できます。たとえば、account_id列の値が1の検索レコードのみ検索するクエリ条件で絞り込むクエリを追加してみます。

'email' => Rule::unique('users')->where(function ($query) {
return $query->where('account_id', 1);
})
参照 https://readouble.com/laravel/8.x/ja/validation.html

ということでした!

まとめ

やりたいことは分かっていてもどうして解決したらよいのかわからないのは結構あるあるだと思います。

調べる力と、違う視点で考えるのが大切ですね。

コメント

タイトルとURLをコピーしました