【Laravel】バリデーションで複数項目の整合性をチェックする方法|sometimesやrequired_ifの応用

【Laravel】バリデーションで複数項目の整合性をチェックする方法|sometimesやrequired_ifの応用 Laravel

Laravelのバリデーションでは、入力値に対して柔軟なルールを設定することができます。特に、複数の項目の関係性に応じた整合性チェックを行いたい場面では、sometimesやrequired_ifなどの条件付きルールが非常に役立ちます。この記事では、これらのルールを活用して「特定の入力がある場合に別の項目も必須にする」といったケースの対応方法を解説します。

フォームでよくある複数項目の依存関係

たとえば以下のようなケースが該当します。

  • 「会社名」が入力されている場合は「部署名」も必須にしたい
  • 「クレジットカード支払い」が選ばれた場合は「カード番号」が必要
  • 「年齢」が20歳未満なら「保護者の同意」チェックボックスが必須

このような複雑な条件を扱うには、単純なrequiredだけでは対応できません。

required_ifルールを使った基本例

required_ifは、ある入力項目の値に応じて、他の項目を必須にできます。

$request->validate([
    'payment_method' => 'required',
    'card_number' => 'required_if:payment_method,credit',
]);

この例では、payment_methodがcreditの場合に、card_numberの入力が必須になります。

sometimesで条件に応じてルールを適用する

FormRequestを使う場合、より柔軟にコントロールしたいときはsometimesメソッドを使うと便利です。

public function rules()
{
    return [
        'company' => 'nullable|string',
        'department' => 'nullable|string',
    ];
}

public function withValidator($validator)
{
    $validator->sometimes('department', 'required', function ($input) {
        return !empty($input->company);
    });
}

この例では、companyが入力されているときだけ、departmentを必須にしています。withValidatorはFormRequest内で使えるメソッドで、カスタムロジックを追加したいときに最適です。

複数項目間の整合性をカスタムバリデーションでチェックする

もっと複雑なロジックが必要な場合は、クロージャやカスタムバリデーションルールを使う方法もあります。

$validator = Validator::make($request->all(), [
    'start_date' => 'required|date',
    'end_date' => 'required|date|after_or_equal:start_date',
]);

このように、end_dateはstart_dateと比較して後または同じ日でなければならないという制約をかけることができます。

カスタムルールクラスを使った整合性チェック

さらに複雑な場合は、Ruleクラスを作成して分離することも可能です。

php artisan make:rule ValidSchedule

生成されたクラス内で、整合性チェックを自由に定義できます。これにより、バリデーションロジックをテストしやすく、再利用性も高まります。

まとめ

Laravelのバリデーションは非常に強力で、required_ifやsometimesを駆使することで、複数項目にまたがる整合性チェックも柔軟に対応できます。特に業務システムやECサイトなど、入力条件が多様なフォームにおいて、ユーザーの入力ミスを防ぎながら使いやすいバリデーションを構築するためには、これらの手法が不可欠です。

条件によって変化するバリデーションが必要な場面では、ぜひ今回紹介した方法を活用してみてください。