public static function buildRelations(MetaClass $class) { $out = null; $knownJunctions = array(); foreach ($class->getAllProperties() as $property) { if ($relation = $property->getRelation()) { $foreignClass = $property->getType()->getClass(); if ($relation->getId() == MetaRelation::ONE_TO_MANY || !$foreignClass->getPattern()->tableExists() || $class->getParent()) { continue; } elseif ($relation->getId() == MetaRelation::MANY_TO_MANY) { $tableName = $class->getTableName() . '_' . $foreignClass->getTableName(); if (isset($knownJunctions[$tableName])) { continue; } else { $knownJunctions[$tableName] = true; } $foreignPropery = clone $foreignClass->getIdentifier(); $name = $class->getName(); $name = strtolower($name[0]) . substr($name, 1); $name .= 'Id'; $foreignPropery->setName($name)->setColumnName($foreignPropery->getConvertedName())->setIdentifier(false); // we don't want any garbage in such tables $property = clone $property; $property->required(); // prevent name collisions if ($property->getRelationColumnName() == $foreignPropery->getColumnName()) { $foreignPropery->setColumnName($class->getTableName() . '_' . $property->getConvertedName() . '_id'); } $out .= <<<EOT \$schema-> \taddTable( \t\tDBTable::create('{$tableName}')-> \t\t{$property->toColumn()}-> \t\t{$foreignPropery->toColumn()}-> \t\taddUniques('{$property->getRelationColumnName()}', '{$foreignPropery->getColumnName()}') \t); EOT; } else { $sourceTable = $class->getTableName(); $sourceColumn = $property->getRelationColumnName(); $targetTable = $foreignClass->getTableName(); $targetColumn = $foreignClass->getIdentifier()->getColumnName(); $out .= <<<EOT // {$sourceTable}.{$sourceColumn} -> {$targetTable}.{$targetColumn} \$schema-> \tgetTableByName('{$sourceTable}')-> \t\tgetColumnByName('{$sourceColumn}')-> \t\t\tsetReference( \t\t\t\t\$schema-> \t\t\t\t\tgetTableByName('{$targetTable}')-> \t\t\t\t\tgetColumnByName('{$targetColumn}'), \t\t\t\tForeignChangeAction::restrict(), \t\t\t\tForeignChangeAction::cascade() \t\t\t); EOT; } } } return $out; }