@@ -95,6 +95,14 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
95
95
$ doctrineTypeField = $ this ->getDoctrineFieldType ($ property , $ resourceClass );
96
96
$ values = array_map ([$ this , 'getIdFromValue ' ], $ values );
97
97
98
+ $ strategy = $ this ->properties [$ property ] ?? self ::STRATEGY_EXACT ;
99
+
100
+ // prefixing the strategy with i makes it case insensitive
101
+ if (0 === strpos ($ strategy , 'i ' )) {
102
+ $ strategy = substr ($ strategy , 1 );
103
+ $ caseSensitive = false ;
104
+ }
105
+
98
106
if ($ metadata ->hasField ($ field )) {
99
107
if (!$ this ->hasValidValues ($ values , $ doctrineTypeField )) {
100
108
$ this ->logger ->notice ('Invalid filter ignored ' , [
@@ -104,34 +112,7 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
104
112
return ;
105
113
}
106
114
107
- $ strategy = $ this ->properties [$ property ] ?? self ::STRATEGY_EXACT ;
108
-
109
- // prefixing the strategy with i makes it case insensitive
110
- if (0 === strpos ($ strategy , 'i ' )) {
111
- $ strategy = substr ($ strategy , 1 );
112
- $ caseSensitive = false ;
113
- }
114
-
115
- if (1 === \count ($ values )) {
116
- $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ alias , $ field , $ doctrineTypeField , $ values [0 ], $ caseSensitive );
117
-
118
- return ;
119
- }
120
-
121
- if (self ::STRATEGY_EXACT !== $ strategy ) {
122
- $ this ->logger ->notice ('Invalid filter ignored ' , [
123
- 'exception ' => new InvalidArgumentException (sprintf ('"%s" strategy selected for "%s" property, but only "%s" strategy supports multiple values ' , $ strategy , $ property , self ::STRATEGY_EXACT )),
124
- ]);
125
-
126
- return ;
127
- }
128
-
129
- $ wrapCase = $ this ->createWrapCase ($ caseSensitive );
130
- $ valueParameter = $ queryNameGenerator ->generateParameterName ($ field );
131
-
132
- $ queryBuilder
133
- ->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' IN (:%s) ' , $ alias , $ field , $ valueParameter ))
134
- ->setParameter ($ valueParameter , $ caseSensitive ? $ values : array_map ('strtolower ' , $ values ));
115
+ $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ alias , $ field , $ doctrineTypeField , $ values , $ caseSensitive );
135
116
}
136
117
137
118
// metadata doesn't have the field, nor an association on the field
@@ -155,63 +136,69 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
155
136
return ;
156
137
}
157
138
158
- $ association = $ field ;
159
- $ valueParameter = $ queryNameGenerator ->generateParameterName ($ association );
160
- if ($ metadata ->isCollectionValuedAssociation ($ association )) {
161
- $ associationAlias = QueryBuilderHelper::addJoinOnce ($ queryBuilder , $ queryNameGenerator , $ alias , $ association );
139
+ $ valueParameter = $ queryNameGenerator ->generateParameterName ($ field );
140
+ if ($ metadata ->isCollectionValuedAssociation ($ field )) {
141
+ $ associationAlias = QueryBuilderHelper::addJoinOnce ($ queryBuilder , $ queryNameGenerator , $ alias , $ field );
162
142
$ associationField = $ associationFieldIdentifier ;
163
143
} else {
164
144
$ associationAlias = $ alias ;
165
145
$ associationField = $ field ;
166
146
}
167
147
168
- if (1 === \count ($ values )) {
169
- $ queryBuilder
170
- ->andWhere (sprintf ('%s.%s = :%s ' , $ associationAlias , $ associationField , $ valueParameter ))
171
- ->setParameter ($ valueParameter , $ values [0 ], $ doctrineTypeField );
172
- } else {
173
- $ queryBuilder
174
- ->andWhere (sprintf ('%s.%s IN (:%s) ' , $ associationAlias , $ associationField , $ valueParameter ))
175
- ->setParameter ($ valueParameter , $ values , $ doctrineTypeField );
176
- }
148
+ $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ associationAlias , $ associationField , $ doctrineTypeField , $ values , $ caseSensitive , $ valueParameter );
177
149
}
178
150
179
151
/**
180
152
* Adds where clause according to the strategy.
181
153
*
182
154
* @throws InvalidArgumentException If strategy does not exist
183
155
*/
184
- protected function addWhereByStrategy (string $ strategy , QueryBuilder $ queryBuilder , QueryNameGeneratorInterface $ queryNameGenerator , string $ alias , string $ field , $ fieldType , $ value , bool $ caseSensitive )
156
+ protected function addWhereByStrategy (string $ strategy , QueryBuilder $ queryBuilder , QueryNameGeneratorInterface $ queryNameGenerator , string $ alias , string $ field , $ fieldType , $ values , bool $ caseSensitive, string $ valueParameter = null )
185
157
{
186
158
$ wrapCase = $ this ->createWrapCase ($ caseSensitive );
187
- $ valueParameter = $ queryNameGenerator ->generateParameterName ($ field );
159
+ $ valueParameter = $ valueParameter ?? $ queryNameGenerator ->generateParameterName ($ field );
160
+ $ values = (array ) $ values ;
161
+
162
+ if (self ::STRATEGY_EXACT !== $ strategy && 1 !== \count ($ values )) {
163
+ $ this ->logger ->notice ('Invalid filter ignored ' , [
164
+ 'exception ' => new InvalidArgumentException (sprintf ('"%s" strategy selected for "%s" property, but only "%s" strategy supports multiple values ' , $ strategy , $ field , self ::STRATEGY_EXACT )),
165
+ ]);
166
+
167
+ return ;
168
+ }
188
169
189
170
switch ($ strategy ) {
190
171
case null :
191
172
case self ::STRATEGY_EXACT :
192
- $ queryBuilder
193
- ->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' = ' .$ wrapCase (':%s ' ), $ alias , $ field , $ valueParameter ))
194
- ->setParameter ($ valueParameter , $ value , $ fieldType );
173
+ if (1 === \count ($ values )) {
174
+ $ queryBuilder
175
+ ->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' = ' .$ wrapCase (':%s ' ), $ alias , $ field , $ valueParameter ))
176
+ ->setParameter ($ valueParameter , $ values [0 ], $ fieldType );
177
+ } else {
178
+ $ queryBuilder
179
+ ->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' IN (:%s) ' , $ alias , $ field , $ valueParameter ))
180
+ ->setParameter ($ valueParameter , $ caseSensitive ? $ values : array_map ('strtolower ' , $ values ));
181
+ }
195
182
break ;
196
183
case self ::STRATEGY_PARTIAL :
197
184
$ queryBuilder
198
185
->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' LIKE ' .$ wrapCase ('CONCAT( \'%% \', :%s, \'%% \') ' ), $ alias , $ field , $ valueParameter ))
199
- ->setParameter ($ valueParameter , $ value , $ fieldType );
186
+ ->setParameter ($ valueParameter , $ values [ 0 ] , $ fieldType );
200
187
break ;
201
188
case self ::STRATEGY_START :
202
189
$ queryBuilder
203
190
->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' LIKE ' .$ wrapCase ('CONCAT(:%s, \'%% \') ' ), $ alias , $ field , $ valueParameter ))
204
- ->setParameter ($ valueParameter , $ value , $ fieldType );
191
+ ->setParameter ($ valueParameter , $ values [ 0 ] , $ fieldType );
205
192
break ;
206
193
case self ::STRATEGY_END :
207
194
$ queryBuilder
208
195
->andWhere (sprintf ($ wrapCase ('%s.%s ' ).' LIKE ' .$ wrapCase ('CONCAT( \'%% \', :%s) ' ), $ alias , $ field , $ valueParameter ))
209
- ->setParameter ($ valueParameter , $ value , $ fieldType );
196
+ ->setParameter ($ valueParameter , $ values [ 0 ] , $ fieldType );
210
197
break ;
211
198
case self ::STRATEGY_WORD_START :
212
199
$ queryBuilder
213
200
->andWhere (sprintf ($ wrapCase ('%1$s.%2$s ' ).' LIKE ' .$ wrapCase ('CONCAT(:%3$s, \'%% \') ' ).' OR ' .$ wrapCase ('%1$s.%2$s ' ).' LIKE ' .$ wrapCase ('CONCAT( \'%% \', :%3$s, \'%% \') ' ), $ alias , $ field , $ valueParameter ))
214
- ->setParameter ($ valueParameter , $ value , $ fieldType );
201
+ ->setParameter ($ valueParameter , $ values [ 0 ] , $ fieldType );
215
202
break ;
216
203
default :
217
204
throw new InvalidArgumentException (sprintf ('strategy %s does not exist. ' , $ strategy ));
0 commit comments