2016-03-28 4 views
1

私はタイトル、本文、回答[] [オプション]、[] [オプション]のフォームを持っています。Laravel 5.2バリデータ:配列リクエストパラメータを検証する少なくとも1つの値を選択する必要があります

私は少なくとも1つの答えが、たとえば、与えられた問題のために選択する必要がありますしたい:私はABC疑問を持っており、その質問のための5つのオプションを持つ

、今少なくとも1つの答えが与えられた質問をチェック、またはすべてしなければなりません。

取り組み

protected $rules = [ 
      'title' => 'required|unique:contents|max:255', 
      'body' => 'required|min:10', 
      'type' => 'required', 
      'belongsto' => 'sometimes|required', 
      'options.*.option' => 'required|max:100', 
      'answers.*.answer' => 'required', 
     ]; 

しかし、これは動作しません。私は少なくとも1つの答えが選ばれなければならない。

私を助けてください。

答えて

1

$ _POSTでは、答えが選択されていないと、空の文字列で埋められた配列が渡されるという問題があります。

$answers[0][0] = '' 
$answers[0][1] = '' 
$answers[0][2] = '' 

配列数が原因空の文字列にゼロより大きくなりますので、したがって、以下は動作しません。

$validator = Validator::make($request->all(), [ 
    'answers.*' => 'required' 
    ]); 

これを解決する最も簡単な方法は、Laravelのを使用してカスタム検証ルールを作成することですValidator :: extend関数です。その後、

Validator::extendImplicit('arrayRequireMin', function($attribute, $values, $parameters) 
    { 
     $countFilled = count(array_filter($values)); 
     return ($countFilled >= $parameters[0]); 
    }); 

そして、あなたの検証要求でそれを呼び出す:

$validator = Validator::make($request->all(), [ 
    'answers.*' => 'arrayRequireMin:1' 
    ]); 

魔法は(array_filterで起こる)配列からすべての空の属性を削除します。これで、必要な最小限の回答数を設定できます。

バリVSバリ:: extendImplicitは()::)(属性が空の場合でも、実行するためのルールについては

を拡張し、ルールは、属性が必要であることを意味するものでなければなりません。こうした "暗黙の" 拡張機能を作成するには、バリ:: extendImplicit()メソッドを使用します

Laravel's validation docs

0

を、それはあなたを助ける

'answer.0' => 'required'  

、これを試してみてください。おもう。

関連する問題