Symfony 6 + EasyAdmin 4自定义过滤器参数覆盖问题求助
问题原因
问题出在两个过滤器的apply方法中,都使用了相同的参数名:value。Doctrine的QueryBuilder会将同名参数的最后一次赋值作为最终值,导致后设置的过滤器值(比如客户ID3)覆盖了先设置的供应商ID13,最终SQL里两个外键条件都用了3。
解决方法
给每个过滤器的查询参数设置唯一名称,避免参数名冲突。可以结合过滤器对应的属性名(client/supplier)来生成参数名,确保唯一性。
修改ClientFilter的apply方法
public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void { if ('' !== $filterDataDto->getValue()) { // 生成唯一参数名:client_value $paramName = $this->getProperty() . '_value'; $queryBuilder ->andWhere(sprintf('entity.%s = :%s', $this->getProperty(), $paramName)) ->setParameter($paramName, $filterDataDto->getValue()); } }
修改SupplierFilter的apply方法
同理,供应商过滤器做相同修改:
public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void { if ('' !== $filterDataDto->getValue()) { // 生成唯一参数名:supplier_value $paramName = $this->getProperty() . '_value'; $queryBuilder ->andWhere(sprintf('entity.%s = :%s', $this->getProperty(), $paramName)) ->setParameter($paramName, $filterDataDto->getValue()); } }
原理说明
Doctrine的参数绑定是按名称匹配的,当多个过滤器使用相同参数名时,后执行的setParameter会覆盖之前的赋值。通过为每个过滤器生成专属的参数名(比如client_value和supplier_value),就能保证两个条件的参数值互不干扰。
内容的提问来源于stack exchange,提问作者Mateo
相关产品推荐
相关产品推荐

