2016-03-28 29 views
1

我有一個表格,我有標題,正文,答案[] [答案]和選項[] [選項]。Laravel 5.2驗證器:驗證陣列請求參數,至少必須選擇一個值

我想ATLEAST一個答案必須選擇給定的問題,例如:

我有ABC問題,有5個選項的這個問題,現在ATLEAST一個答案必須檢查或全部給定的問題。

努力

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

問題是,如果沒有選擇答案,$ _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(),這將刪除陣列中的所有空屬性。現在您可以設置所需的最少數量的答案。

驗證:: extendImplicit()與驗證::延伸()

對於規則運行,即使一個屬性是空的,規則必須意味着該屬性是必需的。要創建這樣一個 「隱性」 的擴展,使用Validator :: extendImplicit()方法:

Laravel's validation docs

0

試試這個,

'answer.0' => 'required'  

它會幫助你。我認爲。