2016-05-26 22 views
1

Ich mache ein einfaches Buchungssystem mit Hilfe von Laravel. Die Zeiten, die gebucht werden, sind für eine imaginäre Autofirma, die Autos mietet. Sie mieten also ein Auto, indem Sie die Zeit buchen. Ich bin ziemlich weit in das Projekt hinein und bin fast fertig. Ich habe nur ein kleines Problem. Ich weiß nicht, wie ich meine gebuchten Zeiten sozusagen "nicht buchbar" machen kann.Laravel 5.2 Validierung Hilfe existiert in Datenbank

Was ich einzigartig sein möchte, ist das Datum der Buchung. In meiner Migration für die „gebucht“ Zeiten (die Tabelle wird als „Zeit“) Ich habe eingestellt bereits die Spalte „Datum“ eindeutig sein:

public function up() 
{ 
    Schema::create('times', function (Blueprint $table) { 
     $table->integer('car_id')->unsigned(); 
     $table->date('date'); 
     $table->timestamps(); 
     $table->primary(array('car_id', 'date')); 
    }); 
} 

Das Datum „integer“ macht es so, dass es einzigartig ist und ich kann es nicht zweimal buchen. Aber was ich tun möchte, ist zu überprüfen, ob die gebuchte Zeit im Carbon-Zeitrahmen der zehn Tage vom heutigen Tag liegt. Diese Zeiten wird wie folgt vorgenommen:

$dt = Carbon::now('Europe/Stockholm'); 
for ($i = 0; $i < 10; $i++) { 
    $dates[$i] = $dt->addDays(1)->toDateString(); 
} 

Dann schicke ich die $ meiner Ansicht variablen Daten und sie wie folgt angezeigt:

<ul class="list-group"> 
    @foreach ($dates as $date) 
     <form method="POST" action="/{{ $car->id }}/time"> 
      {{ csrf_field() }} 
      <li class="list-group-item"> 
       <input type="hidden" name="date" value="{{ $date }}"> 
       {{ $date }} 
       <input type="submit" value="Boka" class="btn btn-primary"/> 
      </li> 
     </form> 
    @endforeach 
</ul> 

Also dann, wenn ich die „Boka“ Taste die Zeit ist in die "Zeiten" -Tabelle eingeben, und weil ich die Beziehung verwende, erreiche ich es mit $ car-> time, so kann ich alle gebuchten Zeiten für dieses bestimmte Auto bekommen.

zeige ich alle Zeiten, die wie folgt meiner Ansicht nach ausgebucht sind:

<ul class="list-group"> 
    @foreach ($car->time as $time) 
     <li class="list-group-item"> 
      {{ $time->date }} 
      <form method="POST" action="/delete/time/{{ $time->car_id }}/{{ $time->date }}"> 
       {{ method_field('DELETE') }} 
       {{ csrf_field() }} 
       <input type="submit" value="Delete" class="btn btn-danger"/> 
      </form> 
     </li> 
    @endforeach 
</ul> 

Also im Grunde, was ich jetzt tun will, ist aus Kohlenstoff, wenn das Datum in der „Zeit“ Tabelle ist zu überprüfen, ich will zu entfernen, mir die „Boka“ -Taste aus der Sicht ..

Mein Lehrer sagt, in irgendeiner Weise den Code zu verwenden:

$this->validate($request, [ 
    'date' => 'exists:times,date' 
]); 

ich weiß, was dieser Code-snippet ist, er die Anforderung gesendet prüft, ob das Datum aus dem Formular existiert in der Zeittabelle am Datum der Spalte. Aber ich weiß einfach nicht wo ich es benutzen soll. Ive versuchte in meinem „TimesController“, wo ich die Daten in die „Zeit“ Tabelle wie folgt hinzu:

public function update(Request $request, Car $car, Time $time) { 

    $this->validate($request, [ 
     'date' => 'exists:times,date' 
    ]); 

    $times = new Time; 
    $times->date = $request->date; 
    $car->time()->save($times); 

    return back(); 
} 

Aber das funktioniert nicht so, wie ich es will. Es prüft, ob das Datum in der Tabelle ist, und wenn es ist. Es zeigt es an. Aber das Problem ist, das Datum muss eindeutig sein, so bekomme ich eine Fehlermeldung, dass das Datum nicht eindeutig ist. Das ist gut, aber nicht das, was ich will. Also wenn ich ein noch nicht gebuchtes Datum anlege. Es fügt das Datum nicht so hinzu, wie es sein sollte. Ich überprüfen, welche Fehler ich schreibe diesen Code in meiner Ansicht zu erhalten:

<ul> 
    @foreach ($errors->all() as $error) 
     <li>{{ $error }}</li> 
    @endforeach 
</ul> 

und der Fehler es ausgegeben: „Das gewählte Datum ist ungültig.“ Also, was ich davon bekomme, ist, dass mein Validierungscode überprüft, ob die Anfrage in der Datenbank ist. Wenn ja, wird das Datum hinzugefügt. Aber wenn das Datum nicht bereits in der "Zeiten" -Tabelle ist, wird es nicht hinzugefügt. Das ist das genaue Gegenteil von dem, was ich will.

Ich habe versucht, es in meinem CarsController zu setzen, wo ich die Daten mit Hilfe von Carbon zusammensetze, wie ich früher gezeigt habe. Aber ich kann nichts davon bekommen ..

Ich weiß, dass dieser Beitrag ist ein bisschen lang. Aber ich wollte so viele Informationen wie möglich einholen. Ich würde wirklich etwas Hilfe schätzen.

TL/DR: Was ich tun möchte, ist die Validate-Funktion in Laravel zu überprüfen, ob meine Daten für die Buchung in der gebuchten "Zeiten" Tabelle oder nicht ist. IF ist es dann möchte ich die "Boka" Schaltfläche verschwinden. Das Datum sollte nicht zur Tabelle "Zeiten" hinzugefügt werden können. Alternativ könnte das "Datum" vollständig von den Daten verschwinden, die mit Carbon gemacht wurden, wenn es in der "Zeiten" -Tabelle ist ...

Ich weiß wirklich nicht, was ich tun soll, also würde ich mich über som help freuen. Vielen Dank. Und ja, Englisch ist nicht meine Muttersprache, also bitte nicht mich bash.

+0

Haben Sie versucht, ein dediziertes FormRequest zu erstellen? Überprüfen Sie meine Antwort, auf der Unterseite :) –

+0

Überprüfen Sie auch das Datumsformat, um gültig zu sein? –

Antwort

0

Es gibt viele Möglichkeiten, Ihre Daten in Laravel zu validieren. Ich werde Ihnen einige von ihnen zeigen, fühlen Sie sich frei, den zu wählen, den Sie mögen.

Vor allem die Grundlagen.

Sie können die validate method in der Controller-Methode Ihrer Wahl verwenden. Die offizielle Dokumentation hat ein schönes Beispiel dafür.

Ihre Validierungsregel geht in den zweiten Parameter der Methode, das Array mit anderen Regeln.

Dies ist jedoch nicht die einzige Möglichkeit, mit der Validierung umzugehen.

Als documentation says in the "Other Validation Approaches" Abschnitt können Sie:

  • manuell einen Validator mit Validator::make() erstellen;
  • machen Sie eine FormRequest, um Ihre Validierungsregeln (und schließlich die Logik) in einer separaten Klasse zu isolieren;

Ich hoffe, es hilft. :)

+0

Ich habe die Dokumentation angeschaut. Und ich denke, dass der Code über das "Existiert" -Stück irgendwie arm ist. Ich weiß nicht wirklich, was ich daraus machen soll. Ich kann natürlich prüfen, ob das Datum in der Tabelle steht "mal" aber jetzt so wie ich es will ... – Addeuz

+0

@Addeuz hast du auch das Datum validiert Format in Ordnung? –

+0

@Francescesco was meinst du? Ich setze das Datumsformat auf JJJJ-MM-TT und es ändert sich überhaupt nicht? – Addeuz

0

Überprüfen Sie einfach nach validate-Methode, dass, wenn es wahr oder falsch zurückgibt und basierend auf dieser Verwendung zurück mit Fehlern oder weiter fortfahren.

Verwandte Themen