Bonjour,
Voila je rencontre un petit problème avec mon code.
Décrivez ici votre code ou ce que vous cherchez à faire
Bonjour
je cherche a filtrer ma recherche de voitures par date de pret, date de retour sur un formulaire de reservation qui s'affiche sur la page d'accueil
je veux faire un autre filtre de recherche par prix et marque dans la page index/car et pour ça j'ai crée une entité search
pour le traitement des deux filtres j'ai utilisé un seul controller car controller et un seul repo carRepo
apres avoir fait le traitement et les requetes mes filtres ne fonctionnent pas! ça fait une semaine que je cherche a resoudre ça sans résultats!!
Merci de votre aide!
je partage mon code
carController
<?php
namespace App\Controller;
use App\Entity\Car;
use App\Entity\Booking;
use App\Entity\Search;
use App\Form\SearchType;
use App\Form\CarType;
use App\Form\BookingType;
use App\Repository\SearchRepository;
use App\Repository\CarRepository;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/car")
*/
class CarController extends AbstractController
{
/**
* @Route("/", name="car_index", methods={"GET","POST"})
*/
public function index(SearchRepository $searchRepository, CarRepository $carRepository, PaginatorInterface $paginatorInterface, Request $request): Response
{
// to use the entity car search in findAllWithPagination function (query treatement)
// car search treatement
$carSearch = new Search();
$booking = new Booking();
$form = $this->createForm(BookingType:: class,$booking);
$form = $this->createForm(SearchType:: class,$carSearch);
$form->handleRequest($request);
$cars = $paginatorInterface->paginate(
$carRepository->findFilter($booking),
$request->query->getInt('page', 1), /*page number*/
6 /*limit per page*/
);
$cars1 = $paginatorInterface->paginate(
$searchRepository->findByMinPrice($carSearch),
$request->query->getInt('page', 1), /*page number*/
6 /*limit per page*/
);
// dd($carRepository->findFilter());
return $this->render('car/index.html.twig', [
'cars' => $cars,
'cars1' => $cars1,
'form' => $form->createView(),
]);
}
/**
* @Route("/new", name="car_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$car = new Car();
$form = $this->createForm(CarType::class, $car);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($car);
$entityManager->flush();
return $this->redirectToRoute('car_index');
}
return $this->render('car/new.html.twig', [
'car' => $car,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="car_show", methods={"GET"})
*/
public function show(Car $car): Response
{
return $this->render('car/show.html.twig', [
'car' => $car,
]);
}
/**
* @Route("/{id}/edit", name="car_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Car $car): Response
{
$form = $this->createForm(CarType::class, $car);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('car_index');
}
return $this->render('car/edit.html.twig', [
'car' => $car,
'form' => $form->createView(),
]);
}
/**
* @Route("/{id}", name="car_delete", methods={"DELETE"})
*/
public function delete(Request $request, Car $car): Response
{
if ($this->isCsrfTokenValid('delete'.$car->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($car);
$entityManager->flush();
}
return $this->redirectToRoute('car_index');
}
}
carRepo
<?php
namespace App\Repository;
use App\Entity\Car;
use App\Entity\Booking;
use App\Form\CarType;
use Doctrine\ORM\Query;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Car|null find($id, $lockMode = null, $lockVersion = null)
* @method Car|null findOneBy(array $criteria, array $orderBy = null)
* @method Car[] findAll()
* @method Car[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class CarRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Car::class);
}
public function findFilter(Booking $booking)
{
$qb = $this->createQueryBuilder('c');
// $qb->select('c.id, b.pickDate, b.returnDate, c.brand')
// ->join('c.bookings', "b")
// ->getQuery()
// ->getResult();
// return $qb;
if ($booking->getPickDate()) {
$qb = $qb
->select('c.id, c.image, c.brand, c.year, c.seats, c.transmission, c.price, b.pickDate, b.returnDate')
->join('c.bookings',"b")
->andWhere('b.pickDate >= :date')
->setParameter('date', $booking->getPickDate());
}
if ($booking->getReturnDate()) {
$qb = $qb
->andWhere('b.returnDate <= :date')
->setParameter('date', $booking->getReturnDate());
}
// dd($qb->getQuery()->getResult());
return $qb->getQuery()->getResult();
}
/*
* @return Query
*/
public function findByMinPrice(Search $carsearch): Query
{
$query = $this->createQueryBuilder('c');
if($carsearch->getMinPrice()){
$query = $query
->atWhere('c.price > :minprice')
->setParameter('minprice', $carsearch->getMinPrice());
}
if($carsearch->getMaxPrice()){
$query = $query
->atWhere('c.price < :maxprice')
->setParameter('maxprice', $carsearch->getMaxPrice());
}
if ($carsearch->getCarBrand()) {
$qb = $qb
->andWhere('c.brand = :carbrand')
->setParameter('carbrand', $carsearch->getCarBrand());
}
return $query->getQuery()->getResult();
}
}
Je veux filtrer ma recherche de voiture par prix , date de pret /retour et marque
J'obtiens soit toute la liste de voitures soit rien!
Il y a une erreur dans le repository
if ($carsearch->getCarBrand()) {
$qb = $qb
->andWhere('c.brand = :carbrand')
->setParameter('carbrand', $carsearch->getCarBrand());
devrait être
f ($carsearch->getCarBrand()) {
$query = $query
->andWhere('c.brand = :carbrand')
->setParameter('carbrand', $carsearch->getCarBrand());
Sinon quand tu crées une query tu peux y ajouter des paramêtres de recherche sans réassigner à chaque fois la query, ex:
$query = $this->createQueryBuilder('c');
if ($carsearch->getMinPrice()){
$query
->atWhere('c.price > :minprice')
->setParameter('minprice', $carsearch->getMinPrice())
;
}