我正在尝试修改 easyadmin 过滤器,以包含一个将查询的行为从“andWhere”更改为“orWhere”的选项,并提供使过滤器成为非排他性的可能性。
我正在尝试使用 ComparysonFilterType 类添加一个复选框:
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('comparison', $options['comparison_type'], $options['comparison_type_options']);
$builder->add('value', FormTypeHelper::getTypeClass($options['value_type']), $options['value_type_options'] + [
'label' => false,
]);
#I've added this field
$builder->add('useOr', CheckboxType::class, [
'label' => 'no excluyente',
'required' => false
]);
}
然后我用一个简单的条件更改过滤器功能:
public function filter(QueryBuilder $queryBuilder, FormInterface $form, array $metadata)
{
$alias = current($queryBuilder->getRootAliases());
$property = $metadata['property'];
$paramName = static::createAlias($property);
$data = $form->getData();
#I've added this lines
if(true === $data["useOr"]){
$queryBuilder->orWhere(sprintf('%s.%s %s :%s', $alias, $property, $data['comparison'], $paramName))
->setParameter($paramName, $data['value']);
}else{
$queryBuilder->andWhere(sprintf('%s.%s %s :%s', $alias, $property, $data['comparison'], $paramName))
->setParameter($paramName, $data['value']);
}
}
这可行,但也许还有另一种方法可以使用更干净的自定义过滤器来实现这一目标。我试图不修改原始类。
我想在任何 filterType 中提供此选项,而不仅仅是在“ComparisonFilterType”中
任何建议