@@ -61,11 +61,37 @@ public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto,
6161 $ value = $ filterDataDto ->getValue ();
6262 $ isMultiple = (bool ) $ filterDataDto ->getFormTypeOption ('value_type_options.multiple ' );
6363
64- if ($ entityDto ->getClassMetadata ()->isCollectionValuedAssociation ($ property )) {
64+ $ aliasToUse = $ alias ;
65+ $ propertyToUse = $ property ;
66+
67+ if (str_contains ($ property , '. ' )) {
68+ [$ joinAlias , $ propertyPath ] = $ this ->createJoinForAssociationFilter ($ queryBuilder , $ alias , $ property , $ parameterName );
69+ $ aliasToUse = $ joinAlias ;
70+ $ propertyToUse = $ propertyPath ;
71+ }
72+
73+ $ classMetadata = $ entityDto ->getClassMetadata ();
74+ if (str_contains ($ property , '. ' )) {
75+ $ em = $ queryBuilder ->getEntityManager ();
76+ $ metadata = $ classMetadata ;
77+ $ parts = explode ('. ' , $ property );
78+ $ lastProperty = array_pop ($ parts );
79+ foreach ($ parts as $ association ) {
80+ if (!$ metadata ->hasAssociation ($ association )) {
81+ break ;
82+ }
83+ $ targetClass = $ metadata ->getAssociationTargetClass ($ association );
84+ $ metadata = $ em ->getClassMetadata ($ targetClass );
85+ }
86+ $ classMetadata = $ metadata ;
87+ $ propertyToUse = $ lastProperty ;
88+ }
89+
90+ if ($ classMetadata ->hasAssociation ($ propertyToUse ) && $ classMetadata ->isCollectionValuedAssociation ($ propertyToUse )) {
6591 // the 'ea_' prefix is needed to avoid errors when using reserved words as assocAlias ('order', 'group', etc.)
6692 // see https://github.com/EasyCorp/EasyAdminBundle/pull/4344
6793 $ assocAlias = 'ea_ ' .$ filterDataDto ->getParameterName ();
68- $ queryBuilder ->leftJoin (sprintf ('%s.%s ' , $ alias , $ property ), $ assocAlias );
94+ $ queryBuilder ->leftJoin (sprintf ('%s.%s ' , $ aliasToUse , $ propertyToUse ), $ assocAlias );
6995
7096 if (0 === \count ($ value )) {
7197 $ queryBuilder ->andWhere (sprintf ('%s %s ' , $ assocAlias , $ comparison ));
@@ -79,12 +105,12 @@ public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto,
79105 ->setParameter ($ parameterName , $ this ->processParameterValue ($ queryBuilder , $ value ));
80106 }
81107 } elseif (null === $ value || ($ isMultiple && 0 === \count ($ value ))) {
82- $ queryBuilder ->andWhere (sprintf ('%s.%s %s ' , $ alias , $ property , $ comparison ));
108+ $ queryBuilder ->andWhere (sprintf ('%s.%s %s ' , $ aliasToUse , $ propertyToUse , $ comparison ));
83109 } else {
84110 $ orX = new Orx ();
85- $ orX ->add (sprintf ('%s.%s %s (:%s) ' , $ alias , $ property , $ comparison , $ parameterName ));
111+ $ orX ->add (sprintf ('%s.%s %s (:%s) ' , $ aliasToUse , $ propertyToUse , $ comparison , $ parameterName ));
86112 if (ComparisonType::NEQ === $ comparison ) {
87- $ orX ->add (sprintf ('%s.%s IS NULL ' , $ alias , $ property ));
113+ $ orX ->add (sprintf ('%s.%s IS NULL ' , $ aliasToUse , $ propertyToUse ));
88114 }
89115 $ queryBuilder ->andWhere ($ orX )
90116 ->setParameter ($ parameterName , $ this ->processParameterValue ($ queryBuilder , $ value ));
0 commit comments