|
|
@@ -0,0 +1,61 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Filter\ApiPlatform;
|
|
|
+
|
|
|
+use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
|
|
|
+use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
|
|
|
+use Doctrine\ORM\QueryBuilder;
|
|
|
+use ApiPlatform\Metadata\Operation;
|
|
|
+
|
|
|
+class ArrayFieldFilter extends AbstractFilter
|
|
|
+{
|
|
|
+ protected function filterProperty(
|
|
|
+ string $property,
|
|
|
+ $value,
|
|
|
+ QueryBuilder $queryBuilder,
|
|
|
+ QueryNameGeneratorInterface $queryNameGenerator,
|
|
|
+ string $resourceClass,
|
|
|
+ ?Operation $operation = null,
|
|
|
+ array $context = []
|
|
|
+ ): void {
|
|
|
+ if (!$this->isPropertyEnabled($property, $resourceClass)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ $parameterName = $queryNameGenerator->generateParameterName($property);
|
|
|
+ $valueArray = json_decode($value, true);
|
|
|
+
|
|
|
+ if (is_array($valueArray)) {
|
|
|
+ $queryBuilder->andWhere($queryBuilder->expr()->orX(
|
|
|
+ ...array_map(function ($val) use ($queryBuilder, $property, $parameterName) {
|
|
|
+ return $queryBuilder->expr()->like(sprintf('o.%s', $property), ':' . $parameterName);
|
|
|
+ }, $valueArray)
|
|
|
+ ));
|
|
|
+ foreach ($valueArray as $key => $val) {
|
|
|
+ $queryBuilder->setParameter($parameterName, '%' . $val . '%');
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $queryBuilder->andWhere(sprintf('o.%s LIKE :%s', $property, $parameterName))
|
|
|
+ ->setParameter($parameterName, '%' . $value . '%');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function getDescription(string $resourceClass): array
|
|
|
+ {
|
|
|
+ if (!$this->properties) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+
|
|
|
+ $description = [];
|
|
|
+ foreach ($this->properties as $property => $strategy) {
|
|
|
+ $description[$property] = [
|
|
|
+ 'property' => $property,
|
|
|
+ 'type' => 'array',
|
|
|
+ 'required' => false,
|
|
|
+ 'swagger' => ['description' => "Filter by $property"],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ return $description;
|
|
|
+ }
|
|
|
+}
|