isUnique pour une combinaison de champs

Par orion93, il y a 9 ans


Salut !
Je suis entrain de créer un système de Like pour des photos et je rencontre un problème:
Le même utilisateur peut liker une même photo plusieurs fois.
Y a t-il un moyen de faire en sorte que la combinaison de deux champs soit unique (pour mon cas user_id et pic_id) à travers les validators de cake ?

4 réponses

AlexJM, il y a 9 ans

Salut,
A travers les validators de cake aucune idée,
Mais en SQL, on peut mettre une clé primaire sur plusieurs champs ;)

orion93, il y a 9 ans

Merci Alex pour ta réponse mais je pense qu'on peut le faire avec les validator de cake. ça fait un moment que je cherche dans la doc, dès que je trouve quelque chose je poste ici.

flashios09, il y a 9 ans

Bonjour orion93,
Je sais pas si Cake\Datasource\RulesChecker::existsIn($field, $table, $message = null) peut résoudre ton problème.
Sinon tu peux créer une règle de validation personnalisée(juste une méthode dans la table):

public function validationDefault(Validator $validator) { $validator // ... ->add('pic_id', $this->_exist()); return $validator; } /** * Return the exist validation rule * @return array */ public function _exist() { return [ '_exist' => [ 'rule' => function ($value, $context) { $conditions = [ 'user_id' => $context['data']['user_id'], 'pic_id' => $context['data']['pic_id'], ]; // on update if (isset($context['data']['id'])) { $conditions += ['id !=' => $context['data']['id']]; } return ($this->exists($conditions)) ? false : true; }, 'on' => function ($context) { return isset($context['data']['user_id'], $context['data']['pic_id']); }, 'last' => true, 'message' => "Votre message", ] ]; }
orion93, il y a 9 ans

Merci flashios09 pour la réponse ça a marché !
Merci beaucoup :D