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