2014-05-11 14 views
13

Ich weiß, dass diese Frage schon oft gestellt wurde, aber niemand erklärt, wie Sie die ID erhalten, wenn Sie im Modell validieren.Laravel: Validierung einmalig auf Update

Meine Validierungsregel ist im Modell, also wie gebe ich die ID des Datensatzes an die Validierungsregel weiter.

Hier ist meine Modelle/User

protected $rules_update = [ 
    'email_address' => 'required|email|unique:users,email_address,'.$id, 
    'first_name' => "required", 
    'last_name' => "required", 
    'password' => "required|min:6|same:password_confirm", 
    'password_confirm' => "required:min:6|same:password", 
    'password_current' => "required:min:6" 
]; 

models/Basemodel

protected $rules = array(); 

public $errors; 

/* 
    * @data: array, Data to be validated 
    * @rules: string, rule name in model 
*/ 

public function validate($data, $rules = "rules") { 

    $validation = Validator::make($data, $this->$rules); 

    if($validation->passes()) { 
     return true; 
    } 

    $this->errors = $validation->messages(); 

    return false; 
} 
+0

Ich würde auch gerne wissen, wie die $ ID an das Modell übergeben wird. Ich benutze das Weg/Datenbank-Paket und habe das gleiche Problem. – Thomas

+0

Ich habe meine Antwort unten hinzugefügt. – user742736

+0

Ich auch, mit dem gleichen Problem – user3189734

Antwort

10

Eine einfache Lösung.

in Ihrem Modell

protected $rules = [ 
    'email_address' => 'sometimes|required|email|unique:users', 
    .. 
]; 

in Ihrem Controller, Aktion: update

... 
$rules = User::$rules; 
$rules['email_address'] = $rules['email_address'] . ',id,' . $id; 
$validationCertificate = Validator::make($input, $rules); 
3

Wenn ich verstehe, was Sie wollen:

'E-Mail' => ‚erforderlich | E-Mail | unique: Benutzer, E-Mail-Adresse, '. $ id. ''

In Modell Update-Methode, zum Beispiel, sollte die $ ID mit Parameter erhalten.

Sorry mein schlechtes Englisch.

+0

Wird der $ ID-Parameter in das Modell übergeben. Ich habe bereits'email 'versucht = =' 'unique: users, email_address, {{$ id}}' ohne Glück ' – user742736

+0

{{$ id}} funktioniert nur in Ansichten mit Blade. Sie sollten also string scape verwenden: 'unique: users, email_address'. $ id. '' oder "unique: users, email_address,". $ id. "" – Lucas

+0

Funktioniert nicht. Fehler unter 1. Symfony \ Component \ Debug \ Exception \ FatalErrorException .../app/models/User.php42 0. Illuminate \ Exception \ Handler handleShutdown Symfony \ Component \ Debug \ Exception \ FatalErrorException Syntaxfehler , unerwartet '.', erwartet ']' – user742736

0

Dies ist, was ich getan habe. Ich bin mir sicher, dass es einen effizienteren Weg gibt, dies zu tun, aber das ist, was ich mir ausgedacht habe.

Modell/User.php

protected $rules = [ 
    'email_address' => 'sometimes|required|email|unique:users,email_address, {{$id}}', 
]; 

Modell/BaseModel.php

public function validate($data, $id = null) { 


     $rules = $this->$rules_string; 

    //let's loop through and explode the validation rules 
    foreach($rules as $keys => $value) { 

     $validations = explode('|', $value); 

     foreach($validations as $key=>$value) { 

      // Seearch for {{$id}} and replace it with $id 
      $validations[$key] = str_replace('{{$id}}', $id, $value); 

     } 
     //Let's create the pipe seperator 
     $implode = implode("|", $validations); 
     $rules[$keys] = $implode; 

    } 
    .... 

    } 

passiere ich die $ user_id auf die Validierung in der Steuerung

Controller/UserController.php

public function update($id) { 

    ..... 

    $user = User::find($user_id); 

    if($user->validate($formRequest, $user_id)) { 
     //validation succcess 
    } 

    .... 


} 
+0

Ich landete nur mit Watson/Validierung – Thomas

+0

Danke, ich werde es mir auch ansehen. – user742736

0

Meine Lösung:

$rules = $user->isDirty('email') ? \User::$rules : array_except(\User::$rules, 'email'); 

Dann Validierung:

$validator = \Validator::make(\Input::all(), $rules, \User::$messages); 

Die Logik ist, wenn die E-Mail-Adresse im Formular anders ist, müssen wir es validieren, wenn die E-Mail nicht geändert hat, müssen wir nicht validieren, also entfernen Sie diese Regel aus der Validierung.

2
public function rules() 
{ 

    switch($this->method()) 
    { 
     case 'GET': 
     case 'DELETE': 
     { 
      return []; 
     } 
     case 'POST': 
     { 
      return [ 
       'name' => 'required|unique:permissions|max:255', 
       'display_name' => 'required', 
      ]; 
     } 
     case 'PUT': 
     case 'PATCH': 
     { 
      return [      
       'name' => 'unique:permissions,name,'.$this->get('id').'|max:255', 
       'display_name' => 'required', 
      ]; 
     } 
     default:break; 
    }  
} 
+0

Manchmal kann die ID Teil der URL sein und Sie finden sie in den Routenparametern: $ this-> route ({field_name}) zB: $ this-> route ('id') – matthiku

+0

immer besser zu erwähnen, Sie kopierten den Code von https://laracasts.com/discuss/channels/requests/laravel-5-validation-request-how-to-handle-validation-on-update –

0

$ validator = Validator :: make ( Array ( 'E-Mail' => $ request [ 'E-Mail'], ), Array ( 'E-Mail' => ‚erforderlich | email | unique: Benutzer, E-Mail, '.$ request ['id'], ));

0

'email' => 'erforderlich | email | unique: benutzer, email_adresse,'. $ Id .'ID‘

Wo ID ist die primäre ID der Tabelle

1
$rules = [ 
    "email" => "email|unique:users, email, {{$id}}, user_id" 
]; 

In Illuminate \ Validierung \ Rules \ Einzigartige;

Einzigartige Validierung wird Zeichenfolge Validierung analysiert Objekt Regel

Einzigartige Validierung hat Muster: einzigartig:% s,% s,% s,% s,% s'

Entsprechende mit: Tabellennamen , Spalte, ignorieren, id Spalte Format wheres

/** 
* Convert the rule to a validation string. 
* 
* @return string 
*/ 
public function __toString() 
{ 
    return rtrim(sprintf('unique:%s,%s,%s,%s,%s', 
     $this->table, 
     $this->column, 
     $this->ignore ?: 'NULL', 
     $this->idColumn, 
     $this->formatWheres() 
    ), ','); 
} 
+0

Ich mag, wo Sie dort hingekommen . Aber ich bin mir nicht sicher, wie ich das auf die Regeln eines Modells anwenden soll. Wo soll ich {{$ id}} ersetzen? – dmmd

4

Es gibt eine elegante Art und Weise, dies zu tun. Wenn Sie Resource Controller verwenden, Ihr Link Ihr Datensatz bearbeiten wird wie folgt aussehen:

/users/{user}/bearbeiten OR/users/1/bearbeiten

Und in Ihrem UserRequest sollte die Regel so aussehen:

public function rules() 
{ 
    return [ 
     'name' => [ 
      'required', 
      'unique:users,name,' . $this->user 
     ], 
    ]; 
} 

Oder wenn Ihr Link Ihren Eintrag wie folgt aussehen zu bearbeiten:

/users/edit/1

du auch versuchen:

public function rules() 
{ 
    return [ 
     'name' => [ 
      'required', 
      'unique:users,name,' . $this->id 
     ], 
    ]; 
} 
0

der einfachste Weg gefunden, funktioniert gut, während ich verwende Laravel 5,2

public function rules() 

{ 

switch ($this->method()) { 
    case 'PUT': 
     $rules = [ 
      'name'     => 'required|min:3', 
      'gender'    => 'required', 
      'email'     => 'required|email|unique:users,id,:id', 
      'password'    => 'required|min:5', 
      'password_confirmation' => 'required|min:5|same:password', 
     ]; 
     break; 

    default: 
     $rules = [ 
      'name'     => 'required|min:3', 
      'gender'    => 'required', 
      'email'     => 'required|email|unique:users', 
      'password'    => 'required|min:5', 
      'password_confirmation' => 'required|min:5|same:password', 
     ]; 
     break; 
} 

return $rules; 
} 
0

Während jeder Aktualisierung Bestehender Datenschreibprüfer wie folgt:

'email' => ['required','email', Rule::unique('users')->ignore($user->id)] 

Dadurch wird der eindeutige Wert der vorhandenen Benutzer-ID für die jeweilige Spalte übersprungen/ignoriert.

0

eine noch einfachere Lösung mit Version getestet 5.2

in Ihrem Modell

// validator rules 
public static $rules = array(
    ... 
    'email_address' => 'email|required|unique:users,id' 
); 
0

nur eine Randnotiz, die meisten Antworten auf diese Frage zu email_address während in Laravel des eingebauten Auth-System Namen, der E-Mail-Feldes sprechen ist nur email. Hier ist ein Beispiel, wie Sie ein eindeutiges Feld validieren können, d. H.eine E-Mail auf dem Update:

In einem Form Request, was Sie tun wie folgt aus:

public function rules() 
{ 
    return [ 
     'email' => 'required|email|unique:users,email,'.$this->user->id, 
    ]; 
} 

Oder wenn Sie Ihre Daten in einem Controller direkt validieren:

public function update(Request $request, User $user) 
{ 
    $request->validate([ 
     'email' => 'required|email|unique:users,email,'.$user->id, 
    ]); 
} 

PS: Ich habe hinzugefügt einige andere Regeln, zB erforderlich und E-Mail, um dieses Beispiel für Neulinge zu verdeutlichen.