/** * @param \Doctrine\ORM\QueryBuilder $q * @param array $args * * @return void */ protected function buildWhereClause(&$q, array $args) { $filter = array_key_exists('filter', $args) ? $args['filter'] : ''; $filterHelper = new SearchStringHelper(); $string = ''; if (!empty($filter)) { if (is_array($filter)) { if (!empty($filter['force'])) { if (is_array($filter['force'])) { //defined columns with keys of column, expr, value $forceParameters = array(); $forceExpressions = $q->expr()->andX(); foreach ($filter['force'] as $f) { if ($f instanceof Query\Expr || $f instanceof CompositeExpression) { $expr = $f; if (isset($expr->parameters)) { $forceParameters = $expr->parameters; unset($expr->parameters); } } elseif (is_array($f)) { list($expr, $parameters) = $this->getFilterExpr($q, $f); $forceExpressions->add($expr); if (!empty($parameters) && is_array($parameters)) { $forceParameters = array_merge($forceParameters, $parameters); } } else { //string so parse as advanced search $parsed = $filterHelper->parseSearchString($f); list($expr, $parameters) = $this->addAdvancedSearchWhereClause($q, $parsed); $forceExpressions->add($expr); if (!empty($parameters) && is_array($parameters)) { $forceParameters = array_merge($forceParameters, $parameters); } } } } else { //string so parse as advanced search $parsed = $filterHelper->parseSearchString($filter['force']); list($forceExpressions, $forceParameters) = $this->addAdvancedSearchWhereClause($q, $parsed); } } if (!empty($filter['string'])) { $string = $filter['string']; } } else { $string = $filter; } //parse the filter if set if (!empty($string) || !empty($forceExpressions)) { if (!empty($string)) { //remove wildcards passed by user if (strpos($string, '%') !== false) { $string = str_replace('%', '', $string); } $filter = $filterHelper->parseSearchString($string); list($expressions, $parameters) = $this->addAdvancedSearchWhereClause($q, $filter); if (!empty($forceExpressions)) { $expressions->add($forceExpressions); $parameters = array_merge($parameters, $forceParameters); } } elseif (!empty($forceExpressions)) { //We do not have a user search but have some required filters $expressions = $forceExpressions; $parameters = $forceParameters; } $filterCount = $expressions instanceof \Countable ? count($expressions) : count($expressions->getParts()); if (!empty($filterCount)) { $q->andWhere($expressions); foreach ($parameters as $k => $v) { if ($v === true || $v === false) { $q->setParameter($k, $v, 'boolean'); } else { $q->setParameter($k, $v); } } } } } }
/** * @param \Doctrine\ORM\QueryBuilder $q * @param array $args */ protected function buildWhereClause(&$q, array $args) { $filter = array_key_exists('filter', $args) ? $args['filter'] : ''; $filterHelper = new SearchStringHelper(); $advancedFilters = new \stdClass(); $advancedFilters->root = []; $advancedFilters->commands = []; // Reset advanced filter commands to be used in search query building $this->advancedFilterCommands = []; $advancedFilterStrings = []; $queryParameters = []; $queryExpression = $q->expr()->andX(); if (!empty($filter)) { if (is_array($filter)) { if (!empty($filter['force'])) { if (is_array($filter['force'])) { //defined columns with keys of column, expr, value foreach ($filter['force'] as $f) { if ($f instanceof Query\Expr || $f instanceof CompositeExpression) { $queryExpression->add($f); if (isset($f->parameters) && is_array($f->parameters)) { $queryParameters = array_merge($queryParameters, $f->parameters); unset($f->parameters); } } elseif (is_array($f)) { list($expr, $parameters) = $this->getFilterExpr($q, $f); $queryExpression->add($expr); if (is_array($parameters)) { $queryParameters = array_merge($queryParameters, $parameters); } } else { //string so parse as advanced search $advancedFilterStrings[] = $f; } } } else { //string so parse as advanced search $advancedFilterStrings[] = $filter['force']; } } if (!empty($filter['string'])) { $advancedFilterStrings[] = $filter['string']; } } else { $advancedFilterStrings[] = $filter; } if (!empty($advancedFilterStrings)) { foreach ($advancedFilterStrings as $parseString) { $parsed = $filterHelper->parseString($parseString); $advancedFilters->root = array_merge($advancedFilters->root, $parsed->root); $filterHelper->mergeCommands($advancedFilters, $parsed->commands); } $this->advancedFilterCommands = $advancedFilters->commands; list($expr, $parameters) = $this->addAdvancedSearchWhereClause($q, $advancedFilters); $queryExpression->add($expr); if (is_array($parameters)) { $queryParameters = array_merge($queryParameters, $parameters); } } //parse the filter if set if ($queryExpression->count()) { $q->andWhere($queryExpression); foreach ($queryParameters as $k => $v) { if ($v === true || $v === false) { $q->setParameter($k, $v, 'boolean'); } else { $q->setParameter($k, $v); } } } } }