Bonjour,

Voila je rencontre un petit problème de logique sur une relation many to many.

j'ai un modèle Document et un modèle Tag.
Chacun d'entre eu a une relation many to many vers l'autre.

j'aimerais via un scop récupérer tous les documents qui ont le tags "bidule" et "truc"
mais ne pas avoir les documents qui ont uniquement le tag "bidule" ou uniquement le tag "truc"

voici ce que j'ai écris pour le moment :

public function scopeByTags($query,array $tags)
  {
    return $query
    ->join('document_tag','documents.id', '=', 'document_tag.document_id')
    ->join('tags','tags.id', '=', 'document_tag.tag_id')
    ->whereIn('tags.slug',$tags);
  }

donc je récupère bien mes documents mais je suis dans le cas de figure ou j'ai les documents seulement avec le tag "bidule" ou "toto"

Merci de vos conseils avisés

2 réponses


Francois Bouyer
Auteur
Réponse acceptée

J'ai réussi pour les curieux voici le code :

public function scopeByTags($query,array $tags)
  {
    return $query
    ->join('document_tag','documents.id', '=', 'document_tag.document_id')
    ->join('tags','tags.id', '=', 'document_tag.tag_id')
    ->whereIn('tags.slug',$tags)
    ->groupBy('tags.id','tags.slug')
    ->havingRaw('count(*) = '.(count($tags)));
  }

Salut,

Je pense que tu devrais faire un tri après avoir récupéré la liste de tous les documents. Après je n'ai pas pris le temps d'analyser le problème donc il est possible que je réponde un peu vite ^^