2121use ApiPlatform \Doctrine \Orm \Util \QueryNameGeneratorInterface ;
2222use ApiPlatform \Exception \InvalidArgumentException ;
2323use ApiPlatform \Metadata \Operation ;
24+ use Doctrine \DBAL \Types \Type ;
2425use Doctrine \DBAL \Types \Types ;
2526use Doctrine \ORM \Query \Expr \Join ;
2627use Doctrine \ORM \QueryBuilder ;
@@ -102,15 +103,17 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
102103 $ values = array_map ($ this ->getIdFromValue (...), $ values );
103104 }
104105
105- if (!$ this ->hasValidValues ($ values , $ this ->getDoctrineFieldType ($ property , $ resourceClass ))) {
106+ $ doctrineTypeField = $ this ->getDoctrineFieldType ($ property , $ resourceClass );
107+
108+ if (!$ this ->hasValidValues ($ values , $ doctrineTypeField )) {
106109 $ this ->logger ->notice ('Invalid filter ignored ' , [
107110 'exception ' => new InvalidArgumentException (sprintf ('Values for field "%s" are not valid according to the doctrine type. ' , $ field )),
108111 ]);
109112
110113 return ;
111114 }
112115
113- $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ alias , $ field , $ values , $ caseSensitive );
116+ $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ alias , $ field , $ values , $ caseSensitive, $ doctrineTypeField );
114117
115118 return ;
116119 }
@@ -141,15 +144,15 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
141144 $ associationField = $ associationFieldIdentifier ;
142145 }
143146
144- $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ associationAlias , $ associationField , $ values , $ caseSensitive );
147+ $ this ->addWhereByStrategy ($ strategy , $ queryBuilder , $ queryNameGenerator , $ associationAlias , $ associationField , $ values , $ caseSensitive, $ doctrineTypeField );
145148 }
146149
147150 /**
148151 * Adds where clause according to the strategy.
149152 *
150153 * @throws InvalidArgumentException If strategy does not exist
151154 */
152- protected function addWhereByStrategy (string $ strategy , QueryBuilder $ queryBuilder , QueryNameGeneratorInterface $ queryNameGenerator , string $ alias , string $ field , mixed $ values , bool $ caseSensitive ): void
155+ protected function addWhereByStrategy (string $ strategy , QueryBuilder $ queryBuilder , QueryNameGeneratorInterface $ queryNameGenerator , string $ alias , string $ field , mixed $ values , bool $ caseSensitive, ? string $ doctrineTypeField ): void
153156 {
154157 if (!\is_array ($ values )) {
155158 $ values = [$ values ];
@@ -163,14 +166,25 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild
163166 if (1 === \count ($ values )) {
164167 $ queryBuilder
165168 ->andWhere ($ queryBuilder ->expr ()->eq ($ wrapCase ($ aliasedField ), $ wrapCase ($ valueParameter )))
166- ->setParameter ($ valueParameter , $ values [0 ]);
169+ ->setParameter ($ valueParameter , $ values [0 ], $ doctrineTypeField );
167170
168171 return ;
169172 }
170173
171174 $ queryBuilder
172175 ->andWhere ($ queryBuilder ->expr ()->in ($ wrapCase ($ aliasedField ), $ valueParameter ))
173- ->setParameter ($ valueParameter , $ caseSensitive ? $ values : array_map ('strtolower ' , $ values ));
176+ ->setParameter ($ valueParameter , array_map (static function ($ value ) use ($ caseSensitive , $ queryBuilder , $ doctrineTypeField ) {
177+
178+ if ($ doctrineTypeField !== null ) {
179+ $ type = Type::getType ($ doctrineTypeField );
180+
181+ if ($ type instanceof Type) {
182+ $ value = $ type ->convertToDatabaseValue ($ value , $ queryBuilder ->getEntityManager ()->getConnection ()->getDatabasePlatform ());
183+ }
184+ }
185+
186+ return $ caseSensitive ? $ value : strtolower ($ value );
187+ }, $ values ));
174188
175189 return ;
176190 }
@@ -210,7 +224,7 @@ protected function addWhereByStrategy(string $strategy, QueryBuilder $queryBuild
210224
211225 $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->orX (...$ ors ));
212226 foreach ($ parameters as $ parameter ) {
213- $ queryBuilder ->setParameter ($ parameter [1 ], $ parameter [0 ]);
227+ $ queryBuilder ->setParameter ($ parameter [1 ], $ parameter [0 ], $ doctrineTypeField );
214228 }
215229 }
216230
0 commit comments