Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

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();
    }
}

Ce que je veux

Je veux filtrer ma recherche de voiture par prix , date de pret /retour et marque

Ce que j'obtiens

J'obtiens soit toute la liste de voitures soit rien!

2 réponses


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())
      ;
}

encore une autre erreur atWhere n'existe pas ! C'est soit where ou andWhere.