2014-04-29 5 views
8

Ich habe ein einfaches Formular, das an einen Controller sendet, der prüft, ob ein Name für einen Artikel bereits für ein bestimmtes Projekt vergeben wurde. Wenn dies der Fall ist, wird ein Fehler zurückgegeben. Dies ist der Code, den ich dafür bin mit:Überprüfen Sie, ob der Name unter nicht gelöschten Elementen mit Laravel-Validierung eindeutig ist.

'name' => 'required|min:1|unique:versions,name,NULL,id,project_id,'.$project->id, 

Das Problem, das ich in laufen habe ist, dass anstelle eines harten löschen, ich bin mit einem weichen löschen Sie sie aus der Datenbank zu entfernen, was bedeutet, dass, Beispiel: "Test" kann nur einmal als Name verwendet werden, auch nachdem er gelöscht wurde.

Wie kann ich überprüfen, ob es für dieses Projekt unter den Elementen, die nicht gelöscht werden, eindeutig ist?

+0

mögliches Duplikat von [Laravel 4 - Wie wird eine eindeutige Validierungsregel/eindeutige Spalten mit weichen Löschungen verwendet?] (Http://stackoverflow.com/questions/17458681/laravel-4-how-to-usea- unique-validation-rule-unique-columns-with-soft-delet) –

+0

Es ist die gleiche Frage, aber eine andere Situation. In diesem Fall werden die gelöschten Datensätze nie wiederhergestellt, sie werden nur als eine Art Archiv gelöscht, das anzeigt, was von wem gemacht wurde und wann sie gelöscht wurden. Da es keine Notwendigkeit für eine Wiederherstellung gibt, gilt die akzeptierte Antwort nicht, und die anderen Antworten treffen nur auf das, was ich bereits getan habe (einzigartig mit einer einzigen Where-Klausel). Im Wesentlichen ist es anders, dass ich wissen möchte, wie es geht, nicht, warum ich es nicht tun sollte. – Samsquanch

+0

Haben Sie versucht [this] (https://github.com/laravel/laravel/issues/2313#issuecomment-24573045)? –

Antwort

17

Sie können dies versuchen:

'name' => 'required|min:1|unique:versions,name,NULL,id,deleted_at,NULL' 

Dies wird sicherstellen, dass die name in der versions Tabelle eindeutig sein wird, wenn ein Datensatz gelöscht weich und hat denselben Namen Namen dann wird es nicht gezählt werden, bedeutet, Name wird akzeptiert, auch wenn es einen gelöschten Datensatz mit dem gleichen Namen gibt.

Um ein Modell beim Aktualisieren zu ignorieren, sollten Sie die id nach name anstelle der ersten NULL übergeben.

Update: auch Sie so etwas wie dieses können Sie Ihre eigenen benutzerdefinierten Regel hinzuzufügen:

// You can declare it inside your controller method before you run validation 
Validator::extend('unique_project', function($attribute, $value, $parameters) 
{ 
    // $attribute will contain field name, i.e. name 
    // $value will contain the value in the $attribute/name 
    // $parameters will be an array of arguments passed 
    // i.e. [0] => arg1, [1] => arg2, [2] => arg3 and so on 

    return true for valid and false for invalid 

}); 

Sie können es verwenden, wie folgt aus:

'name' => 'required|min:1|unique_project:arg1,arg2,arg3' // add more args if needed 
+0

Danke, aber es gibt ein Problem damit - es berücksichtigt nicht die Projekt-ID.Die Einzigartigkeit ist projektbezogen. Projekt 1 kann also eine Version namens "Test" haben und Projekt 2 kann auch eine Version namens "Test" haben. Die von Ihnen gepostete Validierung würde nicht zulassen, dass Projekt 2 "Test" hat, nur Projekt 1. – Samsquanch

+0

Sie können die "project_1 id" hinzufügen, um zu ignorieren, dass selbst beim Einfügen die ID nach dem Namen an der Stelle übergeben wird von 'NULL'. –

+0

Leider wird das auch nicht funktionieren. Ich muss nur die Versionen mit der gleichen Projekt-ID betrachten, nicht die Projekte, die nicht die gleiche ID haben. – Samsquanch

1

Ich weiß, diese Frage ist alt, aber ich stolperte darüber, als ich nach einer Lösung für ein ähnliches Problem suchte. Sie benötigen keinen benutzerdefinierten Validierungscode.

Ich habe eine Datenbank von Ledger-Codes, in denen 'Name' und 'Kurzname' für jeden Benutzer eindeutig sein müssen (Benutzer-ID). Ich habe weiche Löschungen aktiviert, daher sollten sie nur für nicht gelöschte Zeilen für einen bestimmten Benutzer eindeutig sein.

Dies ist meine Funktion, die die Validierung Strings zurückgibt:

protected function validation_data($user_id, $update_id = "NULL") { 
     return [ 
     'name' => "required|max:255|unique:ledger_codes,name,$update_id,id,deleted_at,NULL,user_id,$user_id", 
     'short_name' => "max:255|min:3|unique:ledger_codes,short_name,$update_id,id,deleted_at,NULL,user_id,$user_id", 
     'description' => 'max:255', 
     ]; 
    } 

Für eine über die Syntax Argument Zeichenfolge für den einzigartigen Validator fragen, wird es wie folgt:

arg 0: The table name in the database 
arg 1: the field name in which the value is unique 
arg 2: a single id which is to be ignored (set to uppercase NULL if you are not using it.) 
arg 3: the field in which the single id resides. It defaults to 'id' so if you are not using it, and you have more arguments, use the string 'id'. 
arg 4/5: a field name/value pair for a where clause (where('deleted_at',null) in my example.) 
arg 6/7: another field name/value pair (where('user_id', $user_id) in my example). 
arg 8/9: another field name value pair 
arg 10/11: another....... 
... and so on. 

Die Wertfelder In Feldname/Wert-Paaren kann entweder ein Wert sein, der übereinstimmt, NULL oder NOT_NULL.

Verwandte Themen