web-dev-qa-db-fra.com

composite-unique-key-validation - laravel

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

13
sumit

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;
];
21
harryg

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.

6
nozzleman

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'));
})
2
ErcanE

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
    ]);
1
s vinayagam