【もう迷わない】プログラミングスクールをポイント別に紹介

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

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

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

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

この記事では、IDの存在チェックをRuleを使ってバリデーションする方法を解説します。

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

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

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

Contents

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

<?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'
            ]
        ];
        // exists:テーブル名,存在チェクするID

        return $validate;
    }
}

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

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

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

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

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

<?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],
                    ]);
                })
            ]
        ];

        $validate += [
            'book_name' => [
                'required',
                'max:10'
            ]
        ];

        return $validate;
    }
}

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

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

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

コメント

コメントする

CAPTCHA


Contents
閉じる