Пример #1
0
 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);
         }
     }
 }