Laravelのバリデーションで配列のリクエストを飛ばしたときに少なくとも一つ以上は必須にしたい時の書き方を紹介します。
配列のバリデーション
Laravelでは配列をバリデーションする際は属性名に .* を加えることで、配列の値それぞれにバリデーションが適用することができます。
しかしこれだと配列の値のすべてに適用されてしまうため、少なくとも一つは必須というバリデーションにはできません。
public function rules()
{
return [
'email.*' => 'required',
];
}
少なくとも一つ以上は記入が必須のバリデーション
渡ってきた配列のリクエストをforeachでループさせて空判定をすることで記入の有無でバリデーションをnullableとrequiredで入れ変えることにしました。
もっとスマートな書き方があるかもしれませんがとりあえずはこれで少なくとも一つは入力必須のバリデーションが効くようになるかと思います。
use Illuminate\Http\Request;
public function rules(Request $request)
{
$validation = 'required';
$required = [];
foreach($request->email as $key => $email) {
empty($email) ? $required[] = 'required' : $required[] = 'ok';
}
if(in_array("ok",$required)) {
$validation = 'nullable';
}
return [
'email[]' => $validation,
];
}
/**
* バリデーション項目名定義
* @return array
*/
public function attributes()
{
return [
'email[].required' => "メールアドレスを一つ以上登録してください。",
];
}