2016-03-30 6 views
1

私はlaravel検証システムを使用しています。そして、私はwholesale_priceとしてデータベースがあり、価格は小数です。検証のために私はこれを使用しています。Laravelがゼロの検証ではありません

'wholesale_price' => 'required|regex:/^\d*(\.\d{1,2})?$/', 

しかし、価格は0にはできません。そして、私は、私はそれを行うことができますどのように> 0

を検証する必要があります。 laravel min:1の機能ですが、これは私には役に立ちません。私は、0.005または0.02

+1

カスタムバリデータを使用します。 https://laravel.com/docs/5.2/validation#custom-validation-rules – ceejayoz

答えて

4

あなたはregexを実行する必要はありませんこれを解決する。たとえば、次のテストを取る:

$input = ["wholesale_price" => 0.005]; 
$rules = ["wholesale_price" => "numeric|between:0.001,99.99"]; 

を限り、あなたはnumericルールが必要として、そしてbetweenは、あなたのドン」として限り値を扱います(などintfloatdouble、)数として確認されています$0.001などの文字列値を渡すか、検証前に不要な文字を取り除くと、0以上の値と設定した最大値(現在は99.99ですが、設定できる値は高く設定できます)を返します。 )

単純なテストテンプレートは次のとおりです。

$input = [ 
    "price" => 0 
]; 
$input2 = [ 
    "price" => 0.001 
]; 
$rules = [ 
    "price" => "numeric|between:0.001,99.99", 
]; 

$validator = \Validator::make($input, $rules); 
$validator2 = \Validator::make($input2, $rules); 

dd($validator->passes()); 
// Returns false; 

dd($validator2->passes()); 
// Returns true; 

注:priceは、サーバーにそれを送信している場合だけ$を削除、文字列値である場合にも動作します。

希望に役立ちます!

+0

素敵なトリック私はこれが好きで、私の投票を受けました –

+0

ありがとう:Pなぜ数値的なルールが必要なのかを見つけました。あなたがそれを持っていなければ、 'between'は値を' string'として扱い、 'strlen()'の値をルールと照合するので、 'strlen(" 0.001 ")'は '5'です。 '0.001と99.99'となり、常に検証に合格します。 –

+1

良いトリックのおかげで。 –

0

のような価格を持っているので、どのようにこの正規表現について:

/^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$/ 

説明:

^   # Start of string 
\s*   # Optional whitespace 
(?=.*[1-9]) # Assert that at least one digit > 0 is present in the string 
\d*   # integer part (optional) 
(?:   # decimal part: 
\.   # dot 
\d{1,2}  # plus one or two decimal digits 
)?   # (optional) 
\s*   # Optional whitespace 
$   # End of string 

結論:

'wholesale_price' => 'required|regex:/^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$/', 
関連する問題