/** * @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); } }