问题描述
我正在尝试构建一个查询构建器,用户可以在其中选择多个过滤器在 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();