/** * Returns the expression for a specific filter. * * @param QueryBuilder $queryBuilder * @param $filter * * @throws \Exception * * @return \Doctrine\ORM\Query\Expr\Comparison|\Doctrine\ORM\Query\Expr\Func */ private function getFilterExpression(QueryBuilder $queryBuilder, Filter $filter) { if ($filter->hasSubFilters()) { $subFilterExpressions = []; foreach ($filter->getSubFilters() as $subFilter) { /** * @var $subFilter Filter */ if ($subFilter->getAssociation() !== null) { $this->addJoins($queryBuilder, $subFilter); } $subFilterExpressions[] = $this->getFilterExpression($queryBuilder, $subFilter); } if ($filter->getType() == Filter::TYPE_AND) { return call_user_func_array([$queryBuilder->expr(), "andX"], $subFilterExpressions); } else { return call_user_func_array([$queryBuilder->expr(), "orX"], $subFilterExpressions); } } if ($filter->getAssociation() !== null) { $this->addJoins($queryBuilder, $filter); $alias = $this->getAlias('o.' . $filter->getAssociation()) . '.' . $filter->getProperty(); } else { $alias = 'o.' . $filter->getProperty(); } if (strtolower($filter->getOperator()) == Filter::OPERATOR_IN) { if (!is_array($filter->getValue())) { throw new \Exception('Value needs to be an array for the IN operator'); } return $queryBuilder->expr()->in($alias, $filter->getValue()); } else { $paramName = ':param' . $this->parameterCount; $this->parameterCount++; $queryBuilder->setParameter($paramName, $filter->getValue()); switch (strtolower($filter->getOperator())) { case Filter::OPERATOR_EQUALS: return $queryBuilder->expr()->eq($alias, $paramName); break; case Filter::OPERATOR_GREATER_THAN: return $queryBuilder->expr()->gt($alias, $paramName); break; case Filter::OPERATOR_GREATER_THAN_EQUALS: return $queryBuilder->expr()->gte($alias, $paramName); break; case Filter::OPERATOR_LESS_THAN: return $queryBuilder->expr()->lt($alias, $paramName); break; case Filter::OPERATOR_LESS_THAN_EQUALS: return $queryBuilder->expr()->lte($alias, $paramName); break; case Filter::OPERATOR_NOT_EQUALS: return $queryBuilder->expr()->neq($alias, $paramName); break; case Filter::OPERATOR_LIKE: return $queryBuilder->expr()->like($alias, $paramName); break; default: throw new \Exception('Unknown operator ' . $filter->getOperator()); } } }