QueryBuilder Doctrine : écrire ses requêtes dans Symfony
Le QueryBuilder de Doctrine construit en PHP des requêtes DQL sur mesure, quand findBy() ne suffit plus : filtres facultatifs, tri choisi, jointures.
public function findAvecFiltre(FiltreCarte $filtre): array { $qb = $this->createQueryBuilder('p') ->orderBy('p.'.$filtre->tri->value, 'ASC'); // une enum : « prix » ou « nom », rien d'autre if (null !== $filtre->prixMax) { $qb->andWhere('p.prix <= :prixMax')->setParameter('prixMax', $filtre->prixMax); } return $qb->getQuery()->getResult(); }
On l'appelle depuis un repository avec createQueryBuilder('p'), puis on enchaîne where(), andWhere(), orderBy() et setParameter(). Il produit du DQL : on y parle d'entités et de propriétés (p.prix), pas de tables ni de colonnes. Son intérêt est de composer une requête morceau par morceau, en n'ajoutant une condition que si le filtre est renseigné. Le piège classique : concaténer une valeur venue de la requête HTTP dans la chaîne DQL. Une valeur passe toujours par un paramètre ; un nom de propriété, qu'on ne peut pas paramétrer, doit venir d'une liste fermée, une enum par exemple.
Les exercices font écrire les requêtes de la carte de la taverne, du tri par prix au plat qui tient dans un budget, puis un filtre d'API dont chaque critère est facultatif.
2 exercices font travailler cette notion, en écrivant du code dans le navigateur.