Bonjour a tous,
J'ai un soucis sur un moteur de recherche produits sur lequel je ne comprends vraiment plus rien et je souhaiterai avoir un peu de vos lumières.
Mon site comprend une entité centrale (produit), a laquelle sont rattachés de nombreux éléments (categories, marques, avis, photos...), bref beaucoup de choses... J'ai un moteur de recherche permettant de trouver un produit par le biais de critères ou tout se passe bien sauf quand je veux trier par catégories.
Je m'explique: je veux rendre possible le fait de filtrer les produits en y affichant ceux qui font partis de categories que l'utilisateur aura choisi et ce dans la logique suivante:
- le moteur ne doit retourner que les produits qui font partis de TOUTES les catégories choisies
- le moteur peut afficher des produits qui sont attachés a d'autres catégories tant que l'on respecte la première règle
Actuellement le systême fonctionne presque mais semble retourner tous les produits qui font parti d'au moins une des catégories selectionnées mais cela ne respecte pas ma première règle.
Je pense que mon problème vient de ma facon d'utiliser WHERE IN mais je n'arrive vraiment plus a comprendre. A noter que la relation entre les categories et les produits est ManyToMany.
Voici comment je fais mon tri:
Comme vous pouvez le voir j'ai fais plusieurs tests (dont j'ai laissé les lignes en commentaires), mais rien ne fonctionne comme je le voudrai, d'où pourrait venir mon problème?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public function searchProduits($request, $page, $perPage, $type = null){ $query = $this->createQueryBuilder('p') ->leftJoin('p.avis','a') ->leftJoin('a.user','u') ->leftJoin('p.marque','m') ->leftJoin('p.categories','s') ->leftJoin('s.categorie', 'c') ->leftJoin('p.type','t') ->addSelect('a') ->addSelect('m') ->addSelect('s') ->addSelect('c') ->addSelect('u') ->addSelect('t') ->where('p.active = true') ->groupBy('p'); $categories = array(); foreach($request["categories"] as $cat){ //$query->add('where', $query->expr()->in('s.id', $cat->getId())); // $query->andWhere($query->expr()->in('s.id',$cat->getId())); $categories[] = $cat->getId(); } if(count($categories) > 0){ $query->andWhere('s.id IN(:cats)')->setParameter('cats', $categories); } // suite des tri (par marque / par nb d'avis a la suite du script mais fonctionnel jusque la)
Merci d'avance pour votre aide.
Partager