/** * {@inheritdoc} * * Orders collection by properties. The order of the ordered properties is the same as the order specified in the * query. * For each property passed, if the resource does not have such property or if the order value is different from * `asc` or `desc` (case insensitive), the property is ignored. */ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder) { $request = $this->requestStack->getCurrentRequest(); if (null === $request) { return; } $properties = $this->extractProperties($request); foreach ($properties as $property => $order) { if (!$this->isPropertyEnabled($property) || !$this->isPropertyMapped($property, $resource)) { continue; } if (empty($order) && isset($this->properties[$property])) { $order = $this->properties[$property]; } $order = strtoupper($order); if (!in_array($order, ['ASC', 'DESC'])) { continue; } $alias = 'o'; $field = $property; if ($this->isPropertyNested($property)) { $propertyParts = $this->splitPropertyParts($property); $parentAlias = $alias; foreach ($propertyParts['associations'] as $association) { $alias = QueryNameGenerator::generateJoinAlias($association); $queryBuilder->leftJoin(sprintf('%s.%s', $parentAlias, $association), $alias); $parentAlias = $alias; } $field = $propertyParts['field']; } $queryBuilder->addOrderBy(sprintf('%s.%s', $alias, $field), $order); } }
/** * {@inheritdoc} */ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder) { $request = $this->requestStack->getCurrentRequest(); if (null === $request) { return; } foreach ($this->extractProperties($request) as $property => $values) { // Expect $values to be an array having the period as keys and the date value as values if (!$this->isPropertyEnabled($property) || !$this->isPropertyMapped($property, $resource) || !$this->isDateField($property, $resource) || !is_array($values)) { continue; } $alias = 'o'; $field = $property; if ($this->isPropertyNested($property)) { $propertyParts = $this->splitPropertyParts($property); $parentAlias = $alias; foreach ($propertyParts['associations'] as $association) { $alias = QueryNameGenerator::generateJoinAlias($association); $queryBuilder->join(sprintf('%s.%s', $parentAlias, $association), $alias); $parentAlias = $alias; } $field = $propertyParts['field']; } $nullManagement = isset($this->properties[$property]) ? $this->properties[$property] : null; if (self::EXCLUDE_NULL === $nullManagement) { $queryBuilder->andWhere($queryBuilder->expr()->isNotNull(sprintf('%s.%s', $alias, $field))); } if (isset($values[self::PARAMETER_BEFORE])) { $this->addWhere($queryBuilder, $alias, $field, self::PARAMETER_BEFORE, $values[self::PARAMETER_BEFORE], $nullManagement); } if (isset($values[self::PARAMETER_AFTER])) { $this->addWhere($queryBuilder, $alias, $field, self::PARAMETER_AFTER, $values[self::PARAMETER_AFTER], $nullManagement); } } }
/** * {@inheritdoc} */ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder) { $request = $this->requestStack->getCurrentRequest(); if (null === $request) { return; } foreach ($this->extractProperties($request) as $property => $value) { if (!$this->isPropertyEnabled($property) || !$this->isPropertyMapped($property, $resource, true) || null === $value) { continue; } $alias = 'o'; $field = $property; if ($this->isPropertyNested($property)) { $propertyParts = $this->splitPropertyParts($property); $parentAlias = $alias; foreach ($propertyParts['associations'] as $association) { $alias = QueryNameGenerator::generateJoinAlias($association); $queryBuilder->join(sprintf('%s.%s', $parentAlias, $association), $alias); $parentAlias = $alias; } $field = $propertyParts['field']; $metadata = $this->getNestedMetadata($resource, $propertyParts['associations']); } else { $metadata = $this->getClassMetadata($resource); } if ($metadata->hasField($field)) { if (!is_string($value)) { continue; } if ('id' === $field) { $value = $this->getFilterValueFromUrl($value); } $strategy = null !== $this->properties ? $this->properties[$property] : self::STRATEGY_EXACT; $this->addWhereByStrategy($strategy, $queryBuilder, $alias, $field, $value); } elseif ($metadata->hasAssociation($field)) { $values = (array) $value; foreach ($values as $k => $v) { if (!is_int($k) || !is_string($v)) { unset($values[$k]); } } $values = array_values($values); if (empty($values)) { continue; } $values = array_map([$this, 'getFilterValueFromUrl'], $values); $association = $field; $associationAlias = QueryNameGenerator::generateJoinAlias($association); $valueParameter = QueryNameGenerator::generateParameterName($association); $queryBuilder->join(sprintf('%s.%s', $alias, $association), $associationAlias); if (1 === count($values)) { $queryBuilder->andWhere(sprintf('%s.id = :%s', $associationAlias, $valueParameter))->setParameter($valueParameter, $values[0]); } else { $queryBuilder->andWhere(sprintf('%s.id IN (:%s)', $associationAlias, $valueParameter))->setParameter($valueParameter, $values); } } } }