FindInSetFilter.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Filter\Utils;
  4. use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
  5. use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  6. use ApiPlatform\Metadata\Operation;
  7. use Doctrine\ORM\QueryBuilder;
  8. use Symfony\Component\PropertyInfo\Type;
  9. final class FindInSetFilter extends AbstractFilter {
  10. protected function filterProperty(string $property,
  11. mixed $value,
  12. QueryBuilder $queryBuilder,
  13. QueryNameGeneratorInterface $queryNameGenerator,
  14. string $resourceClass,
  15. Operation $operation = null,
  16. array $context = []): void
  17. {
  18. // otherwise filter is applied to order and page as well
  19. if (!$this->isPropertyEnabled($property, $resourceClass) || !$this->isPropertyMapped($property, $resourceClass)
  20. ) {
  21. return;
  22. }
  23. $alias = $queryBuilder->getRootAliases()[0];
  24. $parameterName = $queryNameGenerator->generateParameterName($property); // Generate a unique parameter name to avoid collisions with other filters
  25. $queryBuilder
  26. ->andWhere(sprintf('find_in_set(:%s, %s.%s) <> 0', $parameterName, $alias, $property))
  27. ->setParameter($parameterName, explode(',', $value));
  28. }
  29. /**
  30. * API docs
  31. * @param string $resourceClass
  32. * @return array[]
  33. */
  34. public function getDescription(string $resourceClass): array
  35. {
  36. if (!$this->properties) {
  37. return [];
  38. }
  39. $description = [];
  40. foreach ($this->properties as $property => $strategy) {
  41. $description["$property"] = [
  42. 'property' => $property,
  43. 'type' => Type::BUILTIN_TYPE_STRING,
  44. 'required' => false,
  45. 'swagger' => [
  46. 'description' => "Filtre de type find_in_set(), vérifie que la valeur est dans le set d'un champs de type CSV",
  47. 'name' => 'FindInSet Filter',
  48. 'type' => 'Utils Filter',
  49. ],
  50. ];
  51. }
  52. return $description;
  53. }
  54. }