QueryBuilder: Variables en paramètres retournent null
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 :
Code:
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);
} |
, par contre, si je fais par exemple :
Code:
andWhere(v.prix_vente >= 100000 and v.prix_vente <=200000)
cela marche parfaitement ...
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 :
Code:
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));
});
});
}; |
VehiculesRepository.php
Code:
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();
} |