0

I'm trying to build a query builder where the user can select multiple filters in Twig and I want them all to be applied on the same entity class. I already tryied to use or and orwhere in the query. Am I making a mistake? Or is there maybe a way to give all fiters the same name, save them as an array and let the query run in a foreach loop?

My attempt with 'OR'

        $fachRepository = $em->getRepository(Fach::class);
        $allFachQuery = $fachRepository->findByFilter2()->orderBy('fh.h', 'ASC');
        
        if (($request->query->getAlnum('h_filter'))
                or($request->query->getAlnum('h_filter2'))
                or($request->query->getAlnum('h_filter3'))
                ){
            $allFachQuery
                    ->where('fh.h LIKE :h OR fh.h LIKE :h2 OR fh.h LIKE :h3')
                    ->setParameter('h', '%' . $request->query->getAlnum('h_filter'). '%')
                    ->setParameter('h2', '%' . $request->query->getAlnum('h_filter2'). '%')
                    ->setParameter('h3', '%' . $request->query->getAlnum('h_filter3'). '%');
        }

        $query = $allFachQuery->getQuery();

My attempt with 'orWhere'

        $fachRepository = $em->getRepository(Fach::class);
        $allFachQuery = $fachRepository->findByFilter2()->orderBy('fh.h', 'ASC');
        
        if (($request->query->getAlnum('h_filter'))
                or($request->query->getAlnum('h_filter2'))
                or($request->query->getAlnum('h_filter3'))
                ){
            $allFachQuery
                    ->where('fh.h LIKE :h')
                    ->where('fh.h LIKE :h2')
                    ->where('fh.h LIKE :h3')
                    ->setParameter('h', '%' . $request->query->getAlnum('h_filter'). '%')
                    ->setParameter('h2', '%' . $request->query->getAlnum('h_filter2'). '%')
                    ->setParameter('h3', '%' . $request->query->getAlnum('h_filter3'). '%');
        }

        $query = $allFachQuery->getQuery();

1 Answers1

0

following your code $allFachQuery is a QueryBuilder, you can check with that :

$hFilter = $request->query->getAlnum('h_filter','');
$hFilter2 = $request->query->getAlnum('h_filter2','');
$hFilter3 = $request->query->getAlnum('h_filter3','');

if (!empty($hFilter) || !empty($hFilter2) || !empty($hFilter3)) {

    $allFachQuery->where(
        $allFachQuery->expr()->orX(
            $allFachQuery->expr()->like('fh.h',':h'),
            $allFachQuery->expr()->like('fh.h',':h2'),
            $allFachQuery->expr()->like('fh.h',':h3')
        )
    );
    $allFachQuery->setParameters([
        'h' =>  "%$hFilter%",
        'h2' => "%$hFilter2%",
        'h3' => "%$hFilter3%",
    ]);
}


$query = $allFachQuery->getQuery();
iraouf
  • 173
  • 10