/** * @param Asserter $asserter asserter * @param integer $aliasNumber aliasNumber */ public function createFromAsserter(Asserter $asserter, $aliasNumber) { $this->aliasNumber = $aliasNumber; $field = $asserter->getField(); $this->location = QueryBuilder::getFieldLocation($field); $this->isNeedJoin = in_array($this->location, array('timeline', 'actionComponent', 'component')); $locationSql = $this->isNeedJoin ? $this->location . $aliasNumber : $this->location; $sqlDefinition = sprintf('%s.%s', $locationSql, $field); $parameterKey = str_replace('.', '_', $sqlDefinition) . uniqid(); $this->parameters[$parameterKey] = $this->transformValue($asserter->getValue(), $field); $operator = $asserter->getOperator(); switch ($operator) { case Asserter::ASSERTER_IN: case Asserter::ASSERTER_NOT_IN: $this->dql = $sqlDefinition . ' ' . $operator . ' (:' . $parameterKey . ')'; break; default: $this->dql = $sqlDefinition . ' ' . $operator . ' :' . $parameterKey; break; } }
/** * @param QueryBuilder $qb qb */ protected function filterCriterias($qb) { if ($this->criterias instanceof Operator) { $visitor = new OperatorVisitor(); } elseif ($this->criterias instanceof Asserter) { $visitor = new AsserterVisitor(); } $criteriaCollection = new CriteriaCollection(); $visitor->visit($this->criterias, $criteriaCollection); $parameters = array(); foreach ($criteriaCollection as $criteria) { $parameters = array_merge($criteria->getParameters(), $parameters); $aliasNumber = $criteria->getAliasNumber(); switch ($criteria->getLocation()) { case 'timeline': $timelineKey = sprintf('timeline%s', $aliasNumber); $qb->leftJoin('action.timelines', $timelineKey, Expr\Join::WITH, $criteria->getDql()); break; case 'actionComponent': $actionComponentKey = sprintf('actionComponent%s', $aliasNumber); $qb->leftJoin('action.actionComponents', $actionComponentKey, Expr\Join::WITH, $criteria->getDql()); break; case 'component': $actionComponentKey = sprintf('actionComponent%s', $aliasNumber); $componentKey = sprintf('component%s', $aliasNumber); $qb->leftJoin('action.actionComponents', $actionComponentKey)->leftJoin(sprintf('%s.component', $actionComponentKey), $componentKey, Expr\Join::WITH, $criteria->getDql()); break; } } $qb->andWhere($visitor->getDql()); foreach ($parameters as $key => $value) { $qb->setParameter($key, $value); } }