So weit ich weiß, gibt es keine Möglichkeit, solche komplexen benutzerdefinierten Regeln auf Laravel zu erreichen. Ich verstehe, dass Sie wirklich wollen, wie dies einige tun:
//////////////////////////////////////////////////
// This is not working code. just an idea !!!
//
$data['period'] = $data['start_date'] . "-" . $data['end_date'];
$validator = Validator::make($data, [
'period' => Rule::unique('projects', DB::raw('concat(start_date, "-", end_date)')),
], [
'period' => 'Period is duplicated.',
]);
Aber Larvel nicht diese Art der Regel akzeptieren (eigentlich frage ich mich, warum sie nicht diese Art von Ansatz akzeptieren)
So haben Sie 2 Optionen.
Lösung 1. Erstellen Sie eine Ansicht in der Datenbank, die zusätzliche Spalte "Periode" haben wird, die von concat (Startdatum, "-", Enddatum) gemacht wird. Und dann den Code wie folgt machen.
$data['period'] = $data['start_date'] . "-" . $data['end_date'];
$validator = Validator::make($data, [
'period' => Rule::unique('projects', DB::raw('concat(start_date, "-", end_date)')),
], [
'period' => 'Period is duplicated.',
]);
if ($validator->fails()) {
// do some thing
} else {
unset($data['period']); // When adding or update, 'period' will cause error because period is only in view, not in table itself
// do insert or update
}
Lösung 2. Nur normale Validierung mit Ausnahme der einmaligen Überprüfung passieren, schließlich Validierung getan, Sie selbst tun Überprüfung manuell in der Tabelle durch die Suche. Wie folgt:
if (Project::where(DB::raw("concat(start_date, '-', end_date)"), "=", $data['start_date'] . "-" . $data['end_date'])->count() > 0) {
// now this is not unique, so do something
}
Wer hat diese Spalten gesetzt? Wo werden diese Spalten festgelegt? – anwerj
Sie stammen aus der Datenbanktabelle. –
Sie wollen also, dass der Unterschied einzigartig ist? können Sie einen Code oder Testfall einfügen, den Sie verwenden – anwerj