semble que ce n'est pas possible avec les validateurs intégrés, comment puis-je implémenter cette fonctionnalité dans le modèle?
$rules = [
'user_id' => 'required|unique:service_details,user_id',
'service_id'=>'required|unique:service_details,service_id'
];
ci-dessus empêchera la duplication de user_id
et service_id
indépendamment, ce qui n'est pas mon exigence
il rejettera
(1,2)
(1,3)
parce que 1 est en double, mais il devrait être accepté car je veux une clé unique composite
La validation de champ unique composite est fournie dans les versions 5.0+ . Je ne peux pas parler pour les versions précédentes.
Vous pouvez essentiellement spécifier une clause where pour le moment où votre règle de validation unique s'applique. Par exemple.
'term' => 'unique:terms,term,NULL,id,taxonomy,category'
Cette règle indique que term
doit être unique dans la table terms
mais uniquement lorsque taxonomy
est égal à "catégorie".
Par exemple, cela empêchera une catégorie "news" d'être dupliquée, mais je peux toujours avoir une balise "news".
Je ne connais pas votre schéma, mais dans votre cas ce serait quelque chose comme ça:
$user_id = Request::get('user_id', $default);
$service_id = Request::get('service_id', $default);
// or another way of specifying the accompanying service/user ID for the where clauses
$rules = [
'user_id' => 'unique:service_details,user_id,NULL,id,service_id,' . $service_id;
'service_id' => 'unique:service_details,service_id,NULL,id,user_id,' . $user_id;
];
Ce n'est pas possible à Laravel. Vous devrez soit écrire un custom validator ou utiliser un paquet pour cela.
En voici un qui devrait faire ce dont vous avez besoin: - https://github.com/felixkiss/uniquewith-validator
Avec ce paquet, vos règles pourraient ressembler à ceci:
$rules = array(
'user_id' => 'required|unique_with:service_details,service_id',
'service_id' => 'required',
);
Cela fonctionne pour Laravel 4 et 5.
Ma solution
Laravel 5.3 et 5.4
Remarque: sans modèle de reliure
Le magasin
'required',
Rule::unique('service_details','service_id')->where(function ($query) {
$query->where('user_id', $this->request->get('user_id'));
})
Mettre à jour
'required',
Rule::unique('service_details','service_id')->ignore($this->route()->id)->where(function ($query) {
$query->where('user_id', $this->request->get('user_id'));
})
Avec l’aide de ce link , je suis en mesure de réaliser la validation composite à partir de laravel 5.3 prêt à l’emploi. Je savais que c'était une vieille question et j'ai déjà répondu. Dans mon cas, la combinaison fournisseur/client est unique.
Mon exemple de code est ci-dessous
$this->validate($request, [
'Vendor'=> 'bail|required|int',
'Client'=> 'bail|required|int',
'discount'=> 'required|numeric',
'Client'=>'unique:billings,client_id,vendor_id'.$request->Vendor
]);