Modèle de mise à jour Laravel avec une règle de validation unique pour l'attribut

Modèle de mise à jour Laravel avec une règle de validation unique pour l'attribut

Problème

J'ai un modèle d'utilisateur Laravel Whre j'ai ajouté une règle de validation unique sur le nom d'utilisateur et l'e-mail. Maintenant, quand je met à jour mon utilisateur via mon dépôt et que je souhaite re-valider mon modèle, j'obtiens une erreur. C'est à quoi ressemble ma méthode de mise à jour

Mise à jour de la fonction publique ($ id, $ data)
$ user = $ this-> findById ($ id);
$ user-> fill ($ data);
$ this-> valider ($ user-> toArray ());
$ user-> sauver ();
retourner $ utilisateur;

Cela échoue dans les tests avec

ValidationException: "Nom d'utilisateur": ["Le nom d'utilisateur a déjà été pris."],
"Email": ["L'e-mail a déjà été pris."]

Y a-t-il un moyen de réparer ceci élégamment?

Solution

C'est une erreur courante à Laravel chaque fois que vous mettez à jour quoi que ce soit. Il nécessitera par défaut l'ID comme clé pour correspondre à l'entrée existante. Donc, ce que vous devez faire est d'ajouter l'ID de l'instance actuellement mise à jour au validateur.

Passez l'ID de votre instance pour ignorer le validateur unique.
Dans le validateur, utilisez un paramètre pour détecter si vous mettez à jour ou créez la ressource.
En cas de mise à jour, forcez la règle unique à ignorer un ID donné:

// Règles de validation
'Email' => 'Unique: utilisateurs, email_address,' . $ utilisateur,
Si vous créez, procédez comme d'habitude:
// Règles de validation
'email' => 'UNIQUE: utilisateurs, e-mail_address',