Example #1
0
 /**
  * @param QueryBuilder $qb
  * @param QueryBuilderTools $qbTools
  * @param array $value
  * @param string $joinType
  * @param array $usedAliases
  * @param array $knownAliases
  */
 protected function addJoinByDefinition(QueryBuilder $qb, QueryBuilderTools $qbTools, array $value, $joinType, array &$usedAliases, array $knownAliases)
 {
     $joinType = strtolower($joinType);
     if (!isset($value['join'][$joinType])) {
         return;
     }
     $defaultValues = ['conditionType' => null, 'condition' => null];
     foreach ((array) $value['join'][$joinType] as $join) {
         if (in_array($join['alias'], $usedAliases)) {
             continue;
         }
         $join = array_merge($defaultValues, $join);
         $joinUsedAliases = array_merge($qbTools->getUsedTableAliases($join['join']), $qbTools->getTablesUsedInJoinCondition($join['condition'], $knownAliases));
         // Intersect with known aliases to prevent counting aliases from subselects
         $joinUsedAliases = array_intersect($joinUsedAliases, $knownAliases);
         $unknownAliases = array_diff($joinUsedAliases, array_merge($usedAliases, [$join['alias']]));
         if (!empty($unknownAliases)) {
             continue;
         }
         $joinMethod = $joinType . 'Join';
         $qb->{$joinMethod}($join['join'], $join['alias'], $join['conditionType'], $join['condition']);
         $usedAliases[] = $join['alias'];
     }
 }
 /**
  * Processes all virtual column join declarations of $joinType type
  *
  * @param array  $joins
  * @param array  $aliases
  * @param array  $query
  * @param string $joinType
  * @param string $parentJoinId
  */
 protected function processVirtualColumnJoins(&$joins, &$aliases, &$query, $joinType, $parentJoinId)
 {
     $joinType = strtolower($joinType);
     if (!isset($query['join'][$joinType])) {
         return;
     }
     foreach ($query['join'][$joinType] as &$item) {
         if (!empty($item['processed'])) {
             continue;
         }
         $condition = $this->getDefinitionJoinCondition($item);
         $usedAliases = $this->qbTools->getTablesUsedInJoinCondition($condition, $this->queryAliases);
         $unknownAliases = array_diff($usedAliases, array_merge(array_keys($this->aliases), [$item['alias']]));
         if ($unknownAliases) {
             continue;
         }
         $item['type'] = $joinType;
         $delimiterPos = strpos($item['join'], '.');
         if (false !== $delimiterPos) {
             $alias = substr($item['join'], 0, $delimiterPos);
             if (!isset($aliases[$alias])) {
                 $aliases[$alias] = $this->generateTableAlias();
             }
             $item['join'] = $aliases[$alias] . substr($item['join'], $delimiterPos);
         }
         $alias = $item['alias'];
         if (!isset($aliases[$alias])) {
             $aliases[$alias] = $this->generateTableAlias();
         }
         $item['alias'] = $aliases[$alias];
         $itemJoinId = $this->joinIdHelper->buildJoinIdentifier($item['join'], $parentJoinId, $item['type'], $this->getJoinDefinitionConditionType($item), $condition);
         if (isset($this->tableAliases[$itemJoinId])) {
             $item['alias'] = $this->tableAliases[$itemJoinId];
             $aliases[$alias] = $this->tableAliases[$itemJoinId];
         }
         $item['processed'] = true;
         $joins[] = $item;
     }
 }