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?
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
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é.
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.
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'
$request->validate([
'email' => 'unique:table_name,email,' . $user->id
]);
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'
];
}
}
Essaye ça
'email' => 'unique:table_name,column_name,'.$this->id.',id'
$this->id
sera la valeur de votre demande
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.
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),
],
]);
// ...
}