はじめに
Laravelでの必須項目のバリデーション設定にて、
「ここの項目に値があれば、こっちの項目を必須にしたい」
なんて思っていた際に便利なバリデーションがあったため、備忘録として残します。
開発環境
php 7.4.7
Laravel 8.16.1
##やりたかったこと
項目A, B, Cいずれかに値がひとつでもあれば、全て必須項目にしたい
条件付きrequired種類
・required_if
=> "指定した項目" が "指定した値" であれば入力必須
・required_unless
=> "指定した項目" が "指定した値" でなければ入力必須
・required_with
=> "指定した項目" が "どれか一つでも記載" されていれば入力必須
・required_with_all
=> "指定した項目" が "すべて記載" されていれば入力必須
・required_without
=> "指定した項目" が "それは一つでも未記入" であれば入力必須
・required_without_all
=> "指定した項目" が "すべて未記入" であれば入力必須
使い方
今回は「required_with」が適用できそうです!
例はRequestsでバリデーションを設定しています。
public static function rules()
{
$validate = [
'item_a' => ['required_with:item_b, item_c'],
'item_b' => ['required_with:item_a, item_c'],
'item_c' => ['required_with:item_a ,item_b']
];
return $validate;
}
問題なくバリデーションが付与されているようですね。
デモ
終わりに
今までifを使用して入力があれば必須というコードを書いていたのですが、見つけた時は驚愕しました。
いやぁ、知らないことばかりです...。
余談ですがデモのようにバリデーションメッセージを変更する場合は下記のようにします。
public function attributes()
{
return [
'item_a' => '項目A',
'item_b' => '項目B',
'item_c' => '項目C',
];
}
public function messages()
{
return [
'required_with' => ':attributeは必須です。(:valuesのいずれかに記載がある場合)',
];
}
制御系をかじっているかたなら常識なのかもしれませんが、誰かの参考にでもなれば幸いです。