Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Validation unique ignore deleted_at

Bom dia,

Tenho em uma migration de Usuarios:

$table->string('email')->unique();
$table->softDeletes();

Um model:

class Usuarios extends Authenticatable
{
    use SoftDeletes;
    //...
}

E uma validation:

'email' => [
    'required',
    'email',
    Rule::unique('users'),
],

Caso de uso:

  1. Criei o usuário 1, ok
  2. Deletei o usuário 1, ok
  3. Criei outro usuário 2 e tentei usar o e-mail 1

Preciso que o Rule permita o uso caso a coluna deleted_at != null.

Em outras palavras: como fazer o unique('users') ignorar os Usuarios que foram softDeleted?

2 respostas
solução!

Oi Ricardo, tudo bom?

Não acredito que seja possivel essa configuração no framework porque essa é uma regra do banco de dados mesmo =/

Quando definimos uma coluna como unique no banco, não conseguimos adicionara dois daquele valor na mesma tabela, o mysql nem vai olhar para as outras colunas. Ou seja, fica dificil fazer um unique com condição.

Você pode vinculara a unicidade de uma coluna com outra. Por exemplo, a combinação cpf + ativo não podem ser repetidas. Essa funcionalidade não vem por padrão no laravel. Mas, aqui você encontra uma implementação disso, que talvez possa te ajudar =)

Com isso, você poderia ter um usuario com o mesmo cpf apagado e um ativo.

Repara que, aparentemente, sua regra de negocio não permite que o cpf seja unico. Se você permite recadastro de usuario com o mesmo cpf é porque o cpf não é unico. Uma outra abordagem é não recadastrar um usuario com o mesmo cpf e sim apenas ativá-lo (remover o soft delete dele no banco).

Espero ter ajudado.

Abraço =)

Obrigado pela resposta, André!

Fiz assim:

Deixei unique(), deixei SoftDeletes e criei uma lixeira pra recuperarem os usuários removidos.

Também incluí na tela de remover um checkbox para [x] remover permanentemente.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software