Exemple #1
0
    public static function buildRelations(MetaClass $class)
    {
        $out = null;
        $knownJunctions = [];
        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\t\\Hesper\\Core\\OSQL\\DBTable::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\t\\Hesper\\Core\\OSQL\\ForeignChangeAction::restrict(),
\t\t\t\t\\Hesper\\Core\\OSQL\\ForeignChangeAction::cascade()
\t\t\t);


EOT;
                }
            }
        }
        return $out;
    }