2016-03-28 1 views
1

Ich habe ein Formular, wo ich Titel, Körper, Antworten [] [Antwort] und Optionen [] [Option].Laravel 5.2 Validator: Validate Array Anfrage Parameter, mindestens ein Wert muss ausgewählt werden

Ich möchte atleast eine Antwort muss für die gegebene Frage ausgewählt werden, zum Beispiel:

ich habe ABC Frage und für diese Frage 5 Optionen haben, jetzt atleast eine Antwort muss für bestimmte Frage geprüft werden oder alle.

Bemühungen

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', 
     ]; 

Aber das funktioniert nicht. Ich möchte mindestens eine Antwort ausgewählt haben.

Bitte helfen Sie mir.

Antwort

1

Das Problem ist, dass auf $ _POST ein Array mit leeren Strings übergeben wird, wenn keine Antwort ausgewählt ist.

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

Daraus ergibt sich die folgende wird nicht funktionieren, da wird Array Zahl als Null auf die leeren Saiten aufgrund größer sein:

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

Der einfachste Weg, dies zu lösen, ist eine benutzerdefinierte Validator Regel mithilfe von Laravel erstellen zu können Validator :: Erweiterungsfunktion.

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

Und dann rufen Sie es in Ihrer Validation Anfrage:

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

Die Magie geschieht in array_filter(), die alle leeren Attribute aus dem Array entfernt. Jetzt können Sie eine Mindestanzahl von Antworten festlegen.

Validator :: extendImplicit() vs Validator erweitern ::()

Für eine Regel sogar zu laufen, wenn ein Attribut leer ist, muss die Regel bedeutet, dass das Attribut erforderlich ist. Um eine solche "implizite" Erweiterung zu erstellen, verwenden Sie den Validator :: extendImplicit() -Methode:

Laravel's validation docs

0

Versuchen Sie dieses,

'answer.0' => 'required'  

es wird Ihnen helfen. Ich denke.