【市場価値がわかる】エンジニア転職におすすめなサイト

LaravelでIDの存在チェックをバリデーションする方法

LaravelでIDの存在チェックのバリデーション

Laravelで存在しないIDがあったらエラーが出るようにバリデーションしたいけど、どうやればいいのかわからない…

こんな疑問を解決します。

Laravelで必須や数値かどうかをバリデーションする基本的なことはわかっていても、ちょっと複雑なバリデーションになると???ってなりませんか?

この記事では、プルダウンで不正なIDをバリデーションする方法を解説します。

結論、Ruleメソッドを使います。

Ruleをマスターすれば、存在チェック以外のバリデーションも実装できるようになるので、バリデーションの幅も広がりますよ。

本記事のゴール
  • LaravelでID存在チェックのバリデーション実装方法がわかる

この記事では、すでにフォームリクエストが作成されている前提です。

Contents

IDチェックが1つの条件のとき

IDの存在チェックがシンプルな場合は、existsを使ってバリデーションができます。

exists:テーブル名,存在チェクするID
でできます。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class BookRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // falseからtrueに変更する
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $validate = [];

        $validate += [
            'category_id' => [
                'exists:categories,category_id'
            ]
        ];

        return $validate;
    }
}

カテゴリーIDが存在しない場合、バリデーションに引っかかります。

※デフォルトのエラーメッセージは英語。以下のように日本語でバリデーションする場合はvalidation.phpをいじる必要あり。フォームリクエストの作成やエラーメッセージについては別の記事をご参照ください。

現在、カテゴリーテーブルにはcategory_id=1,2,3しかないので、category_id=100とかで登録処理するとバリデーションに引っかかります。

複数の条件でIDの存在チェックをする場合

実務になるとよりバリデーションは複雑になって、複数条件になる場合もあるでしょう。その場合はRule::existsを活用します。

準備として、フォームの値とRuleメソッドが使えるように、冒頭にuse Illuminate\Http\Requestとuse Illuminate\Validation\Ruleを追加します。

さらに、rulesの引数をRequest $requestとします。

Rule::exists(‘テーブル名’)->where(function ($query) use ($request) {
$query->where([
[‘チェックするID’, $request->チェックするID],
]);
みたいに書けます。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;←追加
use Illuminate\Validation\Rule;←追加

class BookRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // falseからtrueに変更する
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(Request $request)←追加
    {
        $validate = [];

        $validate += [
            'category_id' => [
                Rule::exists('categories')->where(function ($query) use ($request) {
                    $query->where([
                        ['user_id', $request->user_id],
                        ['category_id', $request->category_id],
                    ]);
                })
            ]
        ];

        return $validate;
    }
}

これでuser_idとcategory_idが存在する場合、バリデーションが通過します。

実務で実際に上記を使うならば、連動するプルダウンなどに使えるでしょう。

カテゴリー選択→サブカテゴリー選択の際にユーザー側で不正なIDの操作などの攻撃を受けた時に存在チェックのバリデーションが使えます。

>>転職するのにおすすめのサイトはこちらをクリック
>>副業で稼ぐためにおすすめのサイトはこちらをクリック

スキルを売り買いするならココナラ

オンライン動画学習ならUdemy

コメント

コメントする

CAPTCHA


Contents
閉じる