1
1

More than 1 year has passed since last update.

【Laravel】「数字入れたら文字数足りてるのにバリデーションエラーになるんだけど…」

Last updated at Posted at 2022-10-12

はじまり

人間さん「なになに、このフォームには顧客IDを入れると」
人間さん「1234っと」

顧客IDは10文字以内で入力してください

人間さん「え、、4文字なのになんで」
人間さん「不具合かな?」

いぬ先生「ちょっと見てみようか」

原因

いぬ先生「状況分かったよ」

人間さん「どんなかんじ?」

$rules = [
    'customer_id' => ['max:10', 'integer']
];

integerが条件に含まれていたから

いぬ先生「今はこうなっているのだけど」
いぬ先生「Laravelではほかのバリデーションとの組み合わせで」
いぬ先生「確認方法が変化するルールがあって」
いぬ先生「今回のように指定ルールにintegerまたはnumericが含まれる場合、」
いぬ先生「maxは文字列長ではなくて、値として確認することになってる」

人間さん「つまりどういうこと?」

いぬ先生「今回だと10文字まで入力可ではなく、」
いぬ先生「1~10の数値が入力できるってこと」

人間さん「試してみるよ」
人間さん「確かに10だったら通ったけど、」
人間さん「11以降ははじかれたよ!」

対応策

人間さん「でもあれだな」
人間さん「意図は、10文字までかと整数であるかを確認したいんだけど…」

正規表現で解決する【regex】

いぬ先生「そしたら正規表現を使うのはどうだろう」

$rules = [
    'customer_id' => ['max:10', 'regex:/^(0|[1-9]\d*)$/']
];

いぬ先生「これで10文字までかの条件を残しつつ、」
いぬ先生「正規表現で数字であるかを確認する」

人間さん「登録できた!」

桁範囲指定でもよい話【digits_between】

いぬ先生「いまさらだけど、要は10桁以内の数値だったらいいのかな?」

人間さん「そうそう」

いぬ先生「それならこれでもよかったのかも」

$rules = [
    'customer_id' => 'digits_between:1,10'
];

Laravel9 では最大桁数指定が使える【max_digits】

いぬ先生「新しく条件でmax_digitsなるものが追加されたようだよ」

$rules = [
    'customer_id' => 'max_digits:10'
];

※日本語ドキュメント抜粋
max_digits:value - Laravel 9.x バリデーション
整数フィールドが、最大値桁数以下であることをバリデートします。

いぬ先生「名称からして最大10桁までということが一目でわかっていいね」

参考文献

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1