2017-03-31 5 views
0

Ich arbeite in Laravel 5.4 und ich habe eine etwas spezifische Validierungsregeln benötigen, aber ich denke, dass dies leicht machbar sein sollte, ohne die Klasse zu erweitern. Nur nicht sicher, wie man das macht.Laravel Validierungsregeln Wenn Wert in einem anderen Feld Array

Was ich tun möchte, ist die 'music_instrument' Formularfeld obligatorisch, wenn program Array enthält 'Music'.

fand ich diesen Thread How to set require if value is chosen in another multiple choice field in validation of laravel? aber es ist keine Lösung (weil es nie an erster Stelle gelöst bekam) und der Grund, warum dies nicht den Fall funktioniert, weil der eingereichten Array-Indizes nicht konstant ist (nicht Kontrollkästchen aktiviert aren ‚t in der Indizierung der Vorlage Ergebnis betrachtet ...)

Mein Fall wie folgt aussieht:

<form action="" method="post"> 
    <fieldset> 

     <input name="program[]" value="Anthropology" type="checkbox">Anthropology 
     <input name="program[]" value="Biology"  type="checkbox">Biology 
     <input name="program[]" value="Chemistry" type="checkbox">Chemistry 
     <input name="program[]" value="Music"  type="checkbox">Music 
     <input name="program[]" value="Philosophy" type="checkbox">Philosophy 
     <input name="program[]" value="Zombies"  type="checkbox">Zombies 

     <input name="music_instrument" type="text" value""> 

     <button type="submit">Submit</button> 

    </fieldset> 
</form> 

Wenn ich einige der Optionen aus der Liste der Kontrollkästchen kann ich möglicherweise dieses Ergebnis habe in meinem $request Werte

[program] => Array 
    (
     [0] => Anthropology 
     [1] => Biology 
     [2] => Music 
     [3] => Philosophy 
    ) 

[music_instrument] => 'Guitar' 

an Regeln hier Validierung der Suche: https://laravel.com/docs/5.4/validation#available-validation-rules Ich denke, so etwas wie seine Arbeit sollte aber ich bin buchstäblich nichts bekommen:

$validator = Validator::make($request->all(),[ 
     'program'   => 'required', 
     'music_instrument' => 'required_if:program,in:Music' 
    ]); 

Ich hatte gehofft, dies auch funktionieren würde, aber kein Glück:

'music_instrument' => 'required_if:program,in_array:Music', 

Gedanken? Vorschläge?

Vielen Dank!

Antwort

5

Haben Sie nicht versucht, aber im allgemeinen Array Felder, die Sie in der Regel schreiben wie diese: program.*, vielleicht so etwas wie dies funktioniert:

$validator = Validator::make($request->all(),[ 
     'program'   => 'required', 
     'music_instrument' => 'required_if:program.*,in:Music' 
    ]); 

Wenn es nicht funktioniert, natürlich können Sie es tun auch in die andere Art und Weise zum Beispiel wie folgt aus:

$rules = ['program' => 'required']; 

if (in_array('Music', $request->input('program', []))) { 
    $rules['music_instrument'] = 'required'; 
} 

$validator = Validator::make($request->all(), $rules); 
+0

habe ich versucht, den Stern, aber es wird ignoriert. Ich konnte es mit required_if: program.34, Music, arbeiten lassen, aber dafür muss ich meine Liste indexieren und den Überblick über 34 behalten, was offensichtlich keine gute Idee ist ... Ich werde diesen Ansatz auch versuchen. Vielen Dank. Ich hatte gehofft Laravel in_array würde funktionieren, aber kein Glück – GRowing

+1

Ich werde Ihre zweite Lösung akzeptieren, dass das ist die Art, wie ich ging :) Danke! Wenn jemand anderes eine Out-of-the-Box-Konfiguration vorschlägt, würde ich es trotzdem gerne sehen ...hehe – GRowing

2

der Ansatz, den ich für ein ähnliches Problem hat war eine private Funktion in meinem Controller-Klasse zu machen und einen ternären Ausdruck verwenden sie das gewünschte Feld hinzufügen, wenn es darum ging, wieder wahr .

Ich habe ungefähr 20 Felder, die ein Kontrollkästchen haben, um die Eingabefelder in diesem Fall zu aktivieren, so dass es im Vergleich möglicherweise übertrieben ist, aber wie Ihre Bedürfnisse wachsen, könnte es sich als hilfreich erweisen.

Mit dieser Funktion können Sie die gleiche Logik anwenden, wenn Sie auch andere Felder für Ihre anderen Programme haben.

dann in der Speicherfunktion:

public function store(Request $request) 
{ 
    $this->validate(request(), [ 
    // ... your other validation here 
    'music_instrument' => ''.($this->_checkProgram($request, 'music') ? 'required' : '').'', 
    // or if you have some other validation like max value, just remember to add the |-delimiter: 
    'music_instrument' => 'max:64'.($this->_checkProgram($request, 'music') ? '|required' : '').'', 
    ]); 

    // rest of your store function 
} 
+0

Das ist eine großartige Idee! Vielen Dank – GRowing

Verwandte Themen