AbstractTimeFilter.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Filter\DoctrineFilter;
  4. use App\Annotation\DateTimeConstraintAware;
  5. use App\Service\Constraint\DateTimeConstraint;
  6. use App\Service\Utils\StringsUtils;
  7. use App\Tests\Filter\DoctrineFilter\DateTimeFilterTest;
  8. use Doctrine\ORM\Mapping\ClassMetadata;
  9. use Doctrine\ORM\Query\Filter\SQLFilter;
  10. /**
  11. * Classe AbstractTimeFilterUtils fournie des méthodes pour construire les requetes de contrainte de temps
  12. */
  13. abstract class AbstractTimeFilter extends SQLFilter
  14. {
  15. /**
  16. * Fonction permettant de construire la requête SQL correspondante aux contraintes
  17. * @param array $constraints
  18. * @param string $targetTableAlias
  19. * @param array $fields
  20. * @return string
  21. */
  22. protected function constructQuery(array $constraints, string $targetTableAlias, array $fields): string{
  23. $queryConditionsAND = [];
  24. foreach ($constraints as $key => $constraint) {
  25. $queryConditionsOR = [];
  26. foreach ($constraint as $date => $conditions){
  27. foreach ($conditions as $condition){
  28. $arithmetic = $this->getArithmeticValue($condition);
  29. if(!is_null($arithmetic))
  30. $queryConditionsOR[] = sprintf("%s.%s %s '%s'", $targetTableAlias, $fields[$key], $arithmetic, $date);
  31. else
  32. $queryConditionsOR[] = sprintf("%s.%s IS NULL", $targetTableAlias, $fields[$key]);
  33. }
  34. }
  35. if(!empty($queryConditionsOR))
  36. $queryConditionsAND[] = sprintf("(%s)", join(' OR ', $queryConditionsOR));
  37. }
  38. return implode(" AND ", $queryConditionsAND);
  39. }
  40. /**
  41. * Fonction retournant la valeur arithmétique correspondant à la condition de la contrainte
  42. * @param $condition
  43. * @return string|null
  44. * @see DateTimeFilterTest::testGetArithmeticValue()
  45. */
  46. protected function getArithmeticValue($condition): string|null{
  47. switch ($condition){
  48. case DateTimeConstraint::INF : return '<';
  49. case DateTimeConstraint::EQUAL : return '=';
  50. case DateTimeConstraint::SUP : return '>';
  51. case DateTimeConstraint::INF + DateTimeConstraint::EQUAL : return '<=';
  52. case DateTimeConstraint::SUP + DateTimeConstraint::EQUAL : return '>=';
  53. }
  54. return null;
  55. }
  56. }