Laravelで存在しないIDがあったらエラーが出るようにバリデーションしたいけど、どうやればいいのかわからない…
こんな疑問を解決します。
Laravelで必須や数値かどうかをバリデーションする基本的なことはわかっていても、ちょっと複雑なバリデーションになると???ってなりませんか?
この記事では、プルダウンで不正なIDをバリデーションする方法を解説します。
結論、Ruleメソッドを使います。
Ruleをマスターすれば、存在チェック以外のバリデーションも実装できるようになるので、バリデーションの幅も広がりますよ。
- LaravelでID存在チェックのバリデーション実装方法がわかる
この記事では、すでにフォームリクエストが作成されている前提です。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
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の操作などの攻撃を受けた時に存在チェックのバリデーションが使えます。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント