diff --git a/httpdocs/src/Filter/CustomJsonOrderFilter.php b/httpdocs/src/Filter/CustomJsonOrderFilter.php index 43f381f..66a6e07 100644 --- a/httpdocs/src/Filter/CustomJsonOrderFilter.php +++ b/httpdocs/src/Filter/CustomJsonOrderFilter.php @@ -23,94 +23,99 @@ class CustomJsonOrderFilter extends AbstractFilter if (!is_array($orderData) || !isset($orderData['active']) || !isset($orderData['direction'])) { return; } + $field = $orderData['active']; $direction = strtoupper($orderData['direction']) === 'DESC' ? 'DESC' : 'ASC'; - $listColDefinition = $orderData['listColDefinition']; - $field = $listColDefinition['field']; - if (array_key_exists('sortingFieldName', $listColDefinition)) { - $field = $listColDefinition['sortingFieldName']; - } - $sortingSubResource = $listColDefinition['sortingSubResource'] ?? null; - $countSortSubresource = $listColDefinition['countSortSubresource'] ?? false; - $countSortSubresourceValue = $listColDefinition['countSortSubresourceValue'] ?? null; - $countSortSubresourceField = $listColDefinition['countSortSubresourceField'] ?? $field; - - $countSortFilterSubResource = $listColDefinition['countSortFilterSubResource'] ?? null; - $countSortFilterSubresourceField = $listColDefinition['countSortFilterSubresourceField'] ?? null; - $countSortFilterSubresourceValue = $listColDefinition['countSortFilterSubresourceValue'] ?? null; - $rootAlias = $queryBuilder->getRootAliases()[0]; - if ($sortingSubResource) { - $subResources = explode('.', $sortingSubResource); - $currentAlias = $rootAlias; - - foreach ($subResources as $index => $subResource) { - $joinAlias = $queryNameGenerator->generateJoinAlias($subResource); - $queryBuilder->leftJoin(sprintf('%s.%s', $currentAlias, $subResource), $joinAlias); - $currentAlias = $joinAlias; + if (array_key_exists('listColDefinition', $orderData)) { + $listColDefinition = $orderData['listColDefinition']; + $field = $listColDefinition['field']; + if (array_key_exists('sortingFieldName', $listColDefinition)) { + $field = $listColDefinition['sortingFieldName']; } + $sortingSubResource = $listColDefinition['sortingSubResource'] ?? null; + $countSortSubresource = $listColDefinition['countSortSubresource'] ?? false; + $countSortSubresourceValue = $listColDefinition['countSortSubresourceValue'] ?? null; + $countSortSubresourceField = $listColDefinition['countSortSubresourceField'] ?? $field; + + $countSortFilterSubResource = $listColDefinition['countSortFilterSubResource'] ?? null; + $countSortFilterSubresourceField = $listColDefinition['countSortFilterSubresourceField'] ?? null; + $countSortFilterSubresourceValue = $listColDefinition['countSortFilterSubresourceValue'] ?? null; + + if ($sortingSubResource) { + $subResources = explode('.', $sortingSubResource); + $currentAlias = $rootAlias; + + foreach ($subResources as $index => $subResource) { + $joinAlias = $queryNameGenerator->generateJoinAlias($subResource); + $queryBuilder->leftJoin(sprintf('%s.%s', $currentAlias, $subResource), $joinAlias); + $currentAlias = $joinAlias; + } - if ($countSortSubresource === true) { - $countAlias = $queryNameGenerator->generateParameterName('count'); - - $subQuery = $queryBuilder->getEntityManager()->createQueryBuilder() - ->select('COUNT(sub)') - ->from($resourceClass, 'main') - ->join(sprintf('main.%s', $sortingSubResource), 'sub'); - - if ($countSortSubresourceValue !== null && $countSortSubresourceField !== null) { - $paramName = $queryNameGenerator->generateParameterName($countSortSubresourceField); - - if (is_array($countSortSubresourceValue)) { - $conditions = []; - foreach ($countSortSubresourceValue as $index => $value) { - $isNegation = strpos($value, '!') === 0; - $actualValue = $isNegation ? substr($value, 1) : $value; - $individualParamName = $paramName . '_' . $index; + if ($countSortSubresource === true) { + $countAlias = $queryNameGenerator->generateParameterName('count'); + + $subQuery = $queryBuilder->getEntityManager()->createQueryBuilder() + ->select('COUNT(sub)') + ->from($resourceClass, 'main') + ->join(sprintf('main.%s', $sortingSubResource), 'sub'); + + if ($countSortSubresourceValue !== null && $countSortSubresourceField !== null) { + $paramName = $queryNameGenerator->generateParameterName($countSortSubresourceField); + + if (is_array($countSortSubresourceValue)) { + $conditions = []; + foreach ($countSortSubresourceValue as $index => $value) { + $isNegation = strpos($value, '!') === 0; + $actualValue = $isNegation ? substr($value, 1) : $value; + $individualParamName = $paramName . '_' . $index; + + if ($isNegation) { + $conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName); + } else { + $conditions[] = sprintf('sub.%s = :%s', $countSortSubresourceField, $individualParamName); + } + $subQuery->setParameter($individualParamName, $actualValue); + } + $subQuery->andWhere($subQuery->expr()->orX(...$conditions)); + } else { + $isNegation = strpos($countSortSubresourceValue, '!') === 0; + $actualValue = $isNegation ? substr($countSortSubresourceValue, 1) : $countSortSubresourceValue; if ($isNegation) { - $conditions[] = sprintf('sub.%s != :%s', $countSortSubresourceField, $individualParamName); + $subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName)); } else { - $conditions[] = sprintf('sub.%s = :%s', $countSortSubresourceField, $individualParamName); + $subQuery->andWhere(sprintf('sub.%s = :%s', $countSortSubresourceField, $paramName)); } - $subQuery->setParameter($individualParamName, $actualValue); - } - $subQuery->andWhere($subQuery->expr()->orX(...$conditions)); - } else { - $isNegation = strpos($countSortSubresourceValue, '!') === 0; - $actualValue = $isNegation ? substr($countSortSubresourceValue, 1) : $countSortSubresourceValue; - - if ($isNegation) { - $subQuery->andWhere(sprintf('sub.%s != :%s', $countSortSubresourceField, $paramName)); - } else { - $subQuery->andWhere(sprintf('sub.%s = :%s', $countSortSubresourceField, $paramName)); + $subQuery->setParameter($paramName, $actualValue); } - $subQuery->setParameter($paramName, $actualValue); } - } - // Additional filtering on countSortFilterSubResource - if ($countSortFilterSubResource && $countSortFilterSubresourceField && $countSortFilterSubresourceValue !== null) { - $filterJoinAlias = $queryNameGenerator->generateJoinAlias($countSortFilterSubResource); - $filterParamName = $queryNameGenerator->generateParameterName($countSortFilterSubresourceField); + // Additional filtering on countSortFilterSubResource + if ($countSortFilterSubResource && $countSortFilterSubresourceField && $countSortFilterSubresourceValue !== null) { + $filterJoinAlias = $queryNameGenerator->generateJoinAlias($countSortFilterSubResource); + $filterParamName = $queryNameGenerator->generateParameterName($countSortFilterSubresourceField); - $subQuery->join(sprintf('sub.%s', $countSortFilterSubResource), $filterJoinAlias) - ->andWhere(sprintf('%s.%s = :%s OR %s.%s IS NULL', $filterJoinAlias, $countSortFilterSubresourceField, $filterParamName, $filterJoinAlias, $countSortFilterSubresourceField)) - ->setParameter($filterParamName, $countSortFilterSubresourceValue); - } + $subQuery->join(sprintf('sub.%s', $countSortFilterSubResource), $filterJoinAlias) + ->andWhere(sprintf('%s.%s = :%s OR %s.%s IS NULL', $filterJoinAlias, $countSortFilterSubresourceField, $filterParamName, $filterJoinAlias, $countSortFilterSubresourceField)) + ->setParameter($filterParamName, $countSortFilterSubresourceValue); + } - $subQuery->andWhere($subQuery->expr()->eq('main.id', $rootAlias . '.id')); + $subQuery->andWhere($subQuery->expr()->eq('main.id', $rootAlias . '.id')); - $queryBuilder->addSelect(sprintf('(%s) as HIDDEN %s', $subQuery->getDQL(), $countAlias)) - ->orderBy($countAlias, $direction); + $queryBuilder->addSelect(sprintf('(%s) as HIDDEN %s', $subQuery->getDQL(), $countAlias)) + ->orderBy($countAlias, $direction); - // Bind the parameter for the main query - foreach ($subQuery->getParameters() as $parameter) { - $queryBuilder->setParameter($parameter->getName(), $parameter->getValue(), $parameter->getType()); + // Bind the parameter for the main query + foreach ($subQuery->getParameters() as $parameter) { + $queryBuilder->setParameter($parameter->getName(), $parameter->getValue(), $parameter->getType()); + } + } else { + $queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction); } } else { - $queryBuilder->orderBy(sprintf('%s.%s', $currentAlias, $field), $direction); + $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction); } } else { $queryBuilder->orderBy(sprintf('%s.%s', $rootAlias, $field), $direction);