/** * @param ResourceInterface $resource * @param QueryBuilder $queryBuilder */ public function apply(ResourceInterface $resource, QueryBuilder $queryBuilder) { $request = $this->requestStack->getCurrentRequest(); if (null === $request) { return; } $properties = $this->queryExtractor->extractProperties($request); $fieldNames = array_flip($this->getClassMetadata($resource)->getFieldNames()); foreach ($properties as $property => $order) { if (!$this->isPropertyEnabled($property) || !isset($fieldNames[$property])) { continue; } elseif ('' === $order && isset($this->properties[$property])) { $order = $this->properties[$property]; } $order = strtoupper($order); if ('ASC' === $order || 'DESC' === $order) { $queryBuilder->addOrderBy(sprintf('o.%s', $property), $order); } } // \Symfony\Component\VarDumper\VarDumper::dump($queryBuilder->getDQL()); // \Symfony\Component\VarDumper\VarDumper::dump($request->query->all()); // \Symfony\Component\VarDumper\VarDumper::dump($properties);die(); }
/** * {@inheritdoc} */ public function apply(QueryBuilder $queryBuilder, string $resourceClass, string $operationName = null) { if (null === ($request = $this->requestStack->getCurrentRequest())) { return null; } $queryValues = $this->queryExtractor->extractProperties($request); $metadata = $this->getClassMetadata($resourceClass); $queryExpr = []; $aliases = []; $associationsMetadata = []; // Retrieve all doctrine query expressions foreach ($queryValues as $key => $value) { if (self::PARAMETER_OPERATOR_OR === $key && is_array($value)) { /* * OR operator case * * At this point $dataSet is expected to equal to something like this: * * $value = [ * 0 => [ * 0 => [ * 'property' => [ * 'operator' => 'operand' * ] * ], * 1 => [ * 'property' => value * ] * ], * 1 => [...], * ... * ] */ foreach ($value as $index => $dataSet) { // Expect $dataSet to be an array containing 2 parameters if (is_array($dataSet) && 2 === count($dataSet)) { $queries = []; // Handle each "query" of $dataSet $count = 0; foreach ($dataSet as $dataSetElem) { if (false === is_array($dataSetElem)) { continue; } $property = key($dataSetElem); // At this point the value may be either a value or an array (for operators) $expr = $this->handleFilter($queryBuilder, $metadata, $aliases, $associationsMetadata, $property, $dataSetElem[$property], sprintf('or_%s%d%d', $property, $index, $count)); $queries = array_merge($queries, $expr); ++$count; } if (2 === count($queries)) { $queryExpr[] = $queryBuilder->expr()->orX($queries[0], $queries[1]); } } } } else { $queryExpr = array_merge($queryExpr, $this->handleFilter($queryBuilder, $metadata, $aliases, $associationsMetadata, $key, $value)); } } foreach ($queryExpr as $expr) { $queryBuilder->andWhere($expr); } }