在 Doctrine (Symfony 4.4) 中对同一实体字段使用多个过滤器

问题描述

我正在尝试构建一个查询构建器,用户可以在其中选择多个过滤器在 Twig 中,我希望它们都应用于同一个实体类。我已经尝试在查询中使用 or 和 orwhere 。我犯了一个错误吗?或者有没有办法给所有的过滤器赋予相同的名称,将它们保存为一个数组并让查询在 foreach 循环中运行?

我对“或”的尝试

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

我对“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_filter3'). '%');
        }

        $query = $allFachQuery->getQuery();

解决方法

按照你的代码 $allFachQuery 是一个 QueryBuilder,你可以检查一下:

$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'),':h3')
        )
    );
    $allFachQuery->setParameters([
        'h' =>  "%$hFilter%",'h2' => "%$hFilter2%",'h3' => "%$hFilter3%",]);
}


$query = $allFachQuery->getQuery();