Laravel: Validação única na atualização

Eu sei que esta pergunta foi perguntada muitas vezes antes, mas ninguém explica como obter o id quando você está validando no modelo.

'email' => 'unique:users,email_address,10' 

Minha regra de validação está no modelo, então, como eu passar a identificação do registro para a regra de validação.

Aqui estão meus modelos / Usuário

 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" ]; 

modelos / modelo base

  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; } 

Uma solução simples.

No seu modelo

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

No seu Controlador, ação: atualização

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

Existe uma maneira elegante de fazer isso. Se você estiver usando o Resource Controllers, seu link para editar seu registro ficará assim:

/ users / {user} / edit OR / users / 1 / edit

E em seu UserRequest, a regra deve ser assim:

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

Ou se o seu link para editar seu registro pareça assim:

/ users / edit / 1

Você também pode tentar isso:

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

Se eu entender o que você quer:

’email’ => ‘requisitado | email | exclusivo: usuários, endereço de e-mail,’. $ id. ”

No método de atualização do modelo, por exemplo, deve receber o $ id com o parâmetro.

Desculpe meu inglês ruim.

 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; } } 
 $rules = [ "email" => "email|unique:users, email, {{$id}}, user_id" ]; 

Em Illuminate \ Validation \ Rules \ Unique;

A validação exclusiva analisará a validação de cadeias para o object Rule

A validação exclusiva tem padrão: exclusivo:% s,% s,% s,% s,% s ‘

Correspondente com: nome da tabela, coluna, ignore, coluna id, formato 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() ), ','); } 

Foi o que acabei fazendo. Tenho certeza de que existe uma maneira mais eficiente de fazer isso, mas isso é o que eu criei.

Modelo / Usuário.php

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

Modelo / 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; } .... } 

Passo o $ user_id para a validação no controlador

Controlador / UserController.php

 public function update($id) { ..... $user = User::find($user_id); if($user->validate($formRequest, $user_id)) { //validation succcess } .... } 

Minha solução:

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

Em seguida, em validação:

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

A lógica é se o endereço de e-mail no formulário for diferente, precisamos validá-lo, se o email não foi alterado, não precisamos validar, então remova essa regra da validação.

$ validator = Validator :: make (array (‘E-mail’ => $ request [’email’],), array (‘E-mail’ => ‘required | email | unique: usuários, email,’. $ Identificação do Pedido’], ));

’email’ => ‘requisitado | email | exclusivo: usuários, endereço de e-mail,’. $ id .’ID ‘

Onde ID é o id primário da tabela

Encontrou a maneira mais fácil, funcionando bem enquanto estou usando o 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; } 

Ao atualizar qualquer validador de gravação de dados existente como segue:

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

Isso ignorará / ignorará a correspondência de valor exclusivo do usuário existente para a coluna específica.

uma solução ainda mais simples testada com a versão 5.2

no seu modelo

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

Apenas uma nota lateral, a maioria das respostas a esta pergunta fala sobre email_address enquanto no sistema de autenticação incorporado da Laravel, o nome do campo de e-mail é apenas um email . Aqui está um exemplo de como você pode validar um campo exclusivo, ou seja, um email na atualização:

Em um Form Request , você gosta disso:

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

Ou se você estiver validando seus dados em um controlador diretamente:

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

PS: adicionei algumas outras regras, ou seja, obrigatório e e-mail, para tornar este exemplo claro para iniciantes.