Bonjour à tous,

Je crée un query builder sur la table produit, pour récupérer mes produits selon différents critères.
Dans les critères, il y a :
- La gamme du produit, où je fais un innerjoin avec l'id et mets la condition sur les libellés de la gamme.
- Les prix min et max, dans la table prixproduit, d'où un innerjoin sur l'id, et mes conditions sur le prix.
- La qualité qui est dans ma table produit, où je sélectionne les valeurs 1 et 2.
- L'indicateur sculpté où je sélectionne la valeur O.

Voilà la partie de code dans mon controleur :
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
$qb = $entitymanager->getRepository('App:Produit')
	->createQueryBuilder('produit')
	->addSelect('produit');
 
$choix_prix_min = 3;
$choix_prix_max = 11;
$filtre_gamme = ['PROTECTION', 'AUTRE'];
 
$qb->innerJoin('App\Entity\Gamme', 'gamme', 'WITH', 'gamme.id = produit.idGamme');
$qb->innerJoin('App\Entity\PrixProduit', 'prixproduit', 'WITH', 'prixproduit.idProduit = produit.id');
$qb->add('where', $qb->expr()->in('gamme.nom', $filtre_gamme));
$qb->andWhere($qb->expr()->gte('prixproduit.prix', $choix_prix_min))
	->andWhere($qb->expr()->lte('prixproduit.prix', $choix_prix_max));
$qb->add('where', $qb->expr()->in('produit.qualite', ['1', '2']));
$qb->add('where', 'produit.sculpte = \'O\'');
 
$q = $qb->orderBy('produit.dateCreation', 'desc')
	->getQuery();
 
$liste_produit = $q->getResult();
Mon problème : Tous les where ne sont pas pris en compte.
Avec le code ci dessus, ça filtre sur la qualité et l'indicateur sculpté, avec un 'ou' au lieu d'un 'et', mais pas sur la gamme.

Si je mets mes where dans ce sens, en mettant la condition sur la gamme à la fin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$qb->innerJoin('App\Entity\Gamme', 'gamme', 'WITH', 'gamme.id = produit.idGamme');
$qb->innerJoin('App\Entity\PrixProduit', 'prixproduit', 'WITH', 'prixproduit.idProduit = produit.id');
$qb->andWhere($qb->expr()->gte('prixproduit.prix', $choix_prix_min))
	->andWhere($qb->expr()->lte('prixproduit.prix', $choix_prix_max));
$qb->add('where', $qb->expr()->in('produit.qualite', ['1', '2']));
$qb->add('where', 'produit.sculpte = \'O\'');
$qb->add('where', $qb->expr()->in('gamme.nom', $filtre_gamme));
ça filtre bien sur la gamme, mais pas sur la qualité ni l'indicateur sculpté, où toutes les valeurs sont prises.

J'ai essayé plein de trucs dans tous les sens, si ça se trouve j'ai raté un paramètre tout bête, mais là je ne vois plus rien !

A moins que ça soit la conception de mon query builder qui ne va pas, mais je ne vois pas non plus.

Merci d'avance pour votre aide.