protected static function joinReferencedTables(ARSchema $schema, ARSelectQueryBuilder $query, &$loadReferencedRecords = false) { // do not use auto-references for single-table one level joins if (!is_string($loadReferencedRecords)) { $loadReferencedRecords = self::addAutoReferences($schema, $loadReferencedRecords); } $tables = is_array($loadReferencedRecords) ? self::array_invert($loadReferencedRecords) : $loadReferencedRecords; $referenceList = $schema->getReferencedForeignKeyList(); $schemaName = $schema->getName(); foreach ($referenceList as $name => $field) { $foreignClassName = $field->getForeignClassName(); $tableAlias = $field->getReferenceName(); $foreignSchema = self::getSchemaInstance($foreignClassName); $foreignTableName = $foreignSchema->getName(); $aliasParts = explode('_', $tableAlias); $aliasName = isset($aliasParts[1]) ? $aliasParts[1] : ''; $isSameSchema = $schema === $foreignSchema; $notRequiredForInclusion = is_array($tables) && !isset($tables[$foreignClassName]); $isAliasSpecified = is_array($tables) && isset($tables[$foreignClassName]) && !is_numeric($tables[$foreignClassName]); if ($isAliasSpecified) { $classNamesDoNotMatch = $tables[$foreignClassName] != $aliasName; $notReferencedAsArray = !is_array($tables[$foreignClassName]); $notInReferencedArray = is_array($tables[$foreignClassName]) && !in_array($aliasName, $tables[$foreignClassName]); } if ($tables !== $schemaName) { if ($isSameSchema || $notRequiredForInclusion || $isAliasSpecified && $classNamesDoNotMatch && ($notReferencedAsArray || $notInReferencedArray) || is_string($tables) && $tables != $schemaName) { continue; } } if (!$query->getJoinsByClassName($foreignTableName)) { $tableAlias = $foreignTableName; } $joined = $query->joinTable($foreignTableName, $schemaName, $field->getForeignFieldName(), $name, $tableAlias); if ($joined) { foreach ($foreignSchema->getFieldList() as $foreignFieldName => $foreignField) { $query->addField($foreignFieldName, $tableAlias, $tableAlias . "_" . $foreignFieldName); } self::getLogger()->logQuery('Joining ' . $foreignClassName . ' on ' . $schemaName); self::joinReferencedTables($foreignSchema, $query, $loadReferencedRecords); } } }