src/DataFilter/OrderRequestSearchDataFilter.php line 14

Open in your IDE?
  1. <?php
  2. namespace App\DataFilter;
  3. use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
  4. use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
  5. use App\Request\OrderRequestRequest;
  6. use Doctrine\ORM\QueryBuilder;
  7. class OrderRequestSearchDataFilter extends AbstractContextAwareFilter
  8. {
  9. protected function filterProperty(
  10. string $property,
  11. $value,
  12. QueryBuilder $queryBuilder,
  13. QueryNameGeneratorInterface $queryNameGenerator,
  14. string $resourceClass,
  15. string $operationName = null
  16. ) {
  17. if ($property !== 'search') {
  18. return;
  19. }
  20. if ($resourceClass !== OrderRequestRequest::class) {
  21. return;
  22. }
  23. $parameterName = $queryNameGenerator->generateParameterName($property);
  24. $value = mb_strtolower($value);
  25. $orClause = $this->buildOrClause(
  26. [
  27. 'articleNumber',
  28. 'customerOrderNumber',
  29. 'name',
  30. 'orderDetails',
  31. 'batchNumber',
  32. 'customerProductNumber',
  33. 'comment',
  34. ],
  35. 'p',
  36. $parameterName
  37. );
  38. $queryBuilder
  39. ->andWhere(sprintf('(%s)', $orClause))
  40. ->setParameter($parameterName, '%'.$value.'%');
  41. }
  42. private function buildOrClause(array $fields, string $table, string $parameterName)
  43. {
  44. $clause = [];
  45. foreach ($fields as $field) {
  46. $clause[] = sprintf('%s.%s LIKE :%s', $table, $field, $parameterName);
  47. }
  48. $clause = implode(' OR ', $clause);
  49. return $clause;
  50. }
  51. public function getDescription(string $resourceClass): array
  52. {
  53. $description = [
  54. 'search' => [
  55. 'property' => 'search',
  56. 'type' => 'string',
  57. 'required' => false,
  58. 'swagger' => [
  59. 'description' => 'Search by the given string case insensitive in multiple fields',
  60. 'name' => 'Custom name to use in the Swagger documentation',
  61. 'type' => 'Will appear below the name in the Swagger documentation',
  62. ],
  63. ],
  64. ];
  65. return $description;
  66. }
  67. }