web-dev-qa-db-fra.com

Laravel vérifier la règle unique sans lui-même dans la mise à jour

J'ai mes règles de validation pour unique dans la section mise à jour.

En insérant ou en ajoutant la règle unique est 'Email' => array('unique:driver_details'), et il vérifiera la colonne unique.

Mais cela échoue pour la section de mise à jour. En le mettant à jour, il satisfait aux autres règles et, dans l'unique adresse e-mail, il vérifie lui-même la colonne unique et il échoue mais voit son propre champ.

Alors, comment puis-je vérifier l'unique, sauf sa propre valeur dans la base de données?

15
user3388086

Cela oblige à ignorer l'identifiant spécifique:

'email' => 'unique:table,email_column_to_check,id_to_ignore'

remplacer les segments table, email_column_to_check, id_to_ignore dans l'exemple ci-dessus

Vous pouvez le vérifier ici http://laravel.com/docs/4.2/validation#rule-unique

28
user3714582

Pour ceux qui utilisent Laravel 5 et les demandes de formulaire, vous pouvez obtenir l'ID du modèle de liaison de modèle de route directement en tant que propriété de la demande de formulaire sous la forme $this->name_of_the_model->id puis utilisez-le pour l'ignorer de la règle unique.

Par exemple, si vous vouliez avoir des e-mails uniques, mais aussi permettre à un administrateur de modifier des utilisateurs, vous pourriez faire:

Route:

Route::patch('users/{user}', 'UserController@update');

Manette:

public function update(UserRequest $request, User $user) 
{
    // ...
}

Demande de formulaire:

class UserRequest extends FormRequest
{
    // ...
    public function rules()
    {
        return [
            'name' => 'required|string',
            'email' => [
                'required',
                'email',
                Rule::unique('users')->ignore($this->user->id, 'id')
            ],
            //...
        ];
    }
    //...
}

Veuillez noter que nous ignorons l'utilisateur en cours de modification, qui dans ce cas peut être différent de l'utilisateur authentifié.

12
Arian Acosta

Inclure la règle en écrivant

use Illuminate\Validation\Rule;

et écrivez votre code de validation comme suit:

 'Email' => [required,
            Rule::unique('driver_details')->ignore($id),
            ]

Ici, $ id est l'identifiant de l'email que vous souhaitez ignorer lors de la validation qui est obtenu du contrôleur.

3
Neeraj Shrestha

J'utilise Laravel 5.2

si votre clé primaire est nommée 'id', le nom de la table est users_table et je veux mettre à jour user_name donc je le fais de cette façon

'user_name'  =>  'required|unique:users_table,user_name,'.$id

si votre clé primaire n'est pas nommée 'id' Dans mon cas, ma clé primaire est user_id et le nom de la table est users_table et je veux mettre à jour user_name

donc je le fais de cette façon

'user_name' => 'required|unique:users_table,user_name,'.$id.',user_id'
2
Nirav Bhoi
$request->validate([
    'email' => 'unique:table_name,email,' . $user->id
]);
2
Ronish

Cela m'a pris un certain temps à comprendre, mais lorsque vous traitez des demandes de mise à jour/création, vous avez également accès à l'objet de demande. Ici, j'applique que les noms de client sont uniques mais autorise le client actuellement édité.

class CreateUpdateClientRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => [
                'required',
                'string',
                'min:3',
                'max:50',
                Rule::unique('clients')->ignore($this->request->get('id'))
            ],
            'primary_contact_name' => 'required|string|min:3|max:50',
            'primary_contact_email' => 'required|string|email|min:5|max:50',
            'primary_contact_phone' => 'nullable|string|min:5|max:50',
            'secondary_contact_name' => 'nullable|string|min:3|max:50',
            'secondary_contact_email' => 'nullable|string|email|min:5|max:50',
            'secondary_contact_phone' => 'nullable|string|min:5|max:50',
            'notes' => 'nullable'
        ];
    }
}
1
Juha Vehnia

Essaye ça

'email' => 'unique:table_name,column_name,'.$this->id.',id'

$this->id sera la valeur de votre demande

1
mwafi

A été confronté à ce problème pendant un certain temps également. Essaye ça:

$v = Validator::make($request->all(), [
    'email' => ['required',
    Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
    ]
]);

Fonctionne sur Laravel 5.8. Je ne sais pas si cela fonctionne sur les versions inférieures de Laravel.

0
fabian

Dans l'application Laravel 6, cela m'a aidé à exclure les e-mails de l'utilisateur actuel de la validation:

use Illuminate\Validation\Rule;

public function update(Request $request, $id)
{
    $request->validate([
        'email' => [
            'email',
            'required',
             Rule::unique('claims')->ignore($id),
        ],
    ]);

    // ...
}
0
yesnik