Bonjour,
Actuellement dans la phase d'implémentation de filtres d'intervalles (min et max) dans mon VehiculesRepository, les requêtes reviennent avec null en utilisant les variables en tant que paramètres dans le querybuilder :
, par contre, si je fais par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if ($prixMin != null && $prixMax != null) { $query->andWhere('v.prix_vente >= :prixMin and v.prix_vente <= :prixMax') ->setParameter(':prixMin', $prixMin) ->setParameter(':prixMax', $prixMax); }
cela marche parfaitement ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part andWhere(v.prix_vente >= 100000 and v.prix_vente <=200000)
Je ne sais pas si il faut formatter les variables/paramètres d'une certaine façon ou bien si j'oublie une référence dans mon code JS car on dirait que les variables $prixMin et $prixMax ne sont pas disponibles dans le repository/querybuilder ou contiennent des valeurs nulles.
A noter que les variables sont bien présentes dans l'uri indépendament de cela... Merci d'avance pour votre expertise
filters.js :
VehiculesRepository.php
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
31
32
33
34
35
36
37
38
39
40
41
42 window.onload = () => { //Filtres de type input const filtersForm = document.querySelector("#filters"); document.querySelectorAll("#filters input").forEach((input) => { input.addEventListener("input", () => { //Récupération des données du formulaire const Form = new FormData(filtersForm); //Création de la queryString const Params = new URLSearchParams(); Form.forEach((value, key) => { Params.append(key, value); }); //Récupération de l'url active const Url = new URL(window.location.href); //Lancement requête Ajax fetch(Url.pathname + "?" + Params.toString() + "&ajax=1", { headers: { "X-Requested-With": "XMLHttpRequest", }, }) .then((response) => response.json()) .then((data) => { //Recherche de la zone de contenu const content = document.querySelector("#content"); //Remplacement du contenu content.innerHTML = data.content; //Mise à jour de l'url history.pushState({}, null, Url.pathname + "?" + Params.toString()); }) .catch((e) => alert(e)); }); }); };
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 <?php namespace App\Repository; use App\Entity\Vehicules; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; /** * @extends ServiceEntityRepository<Vehicules> * * @method Vehicules|null find($id, $lockMode = null, $lockVersion = null) * @method Vehicules|null findOneBy(array $criteria, array $orderBy = null) * @method Vehicules[] findAll() * @method Vehicules[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class VehiculesRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Vehicules::class); } public function save(Vehicules $entity, bool $flush = false): void { $this->getEntityManager()->persist($entity); if ($flush) { $this->getEntityManager()->flush(); } } public function remove(Vehicules $entity, bool $flush = false): void { $this->getEntityManager()->remove($entity); if ($flush) { $this->getEntityManager()->flush(); } } //Pagination liste véhicules après filtre public function getVehiculesPaginated(int $page, int $limit = 100, $filtreTypes = null, $filtreMarques = null, int $prixMin = null, int $prixMax = null) { $limit = abs($limit); $query = $this->createQueryBuilder('v'); //On filtre si filtre multicritères actif if ($filtreTypes != null) { $query->where('v.type_vehicule IN (:types)') ->setParameter(':types', array_values($filtreTypes)); } if ($filtreMarques != null) { $query->andWhere('v.marque IN(:marques)') ->setParameter(':marques', array_values($filtreMarques)); } //Filtre sur intervalle de prix if ($prixMin != null && $prixMax != null) { $query->andWhere('v.prix_vente >= :prixMin and v.prix_vente <= :prixMax') ->setParameter(':prixMin', $prixMin) ->setParameter(':prixMax', $prixMax); } dd($prixMax); $query->orderBy('v.marque') ->orderBy('v.prix_vente') ->setFirstResult(($page * $limit) - $limit) ->setMaxResults($limit); return $query->getQuery()->getResult(); }
Partager