Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00015 final class SchemaBuilder extends BaseBuilder
00016 {
00017 public static function buildTable($tableName, array $propertyList)
00018 {
00019 $out = <<<EOT
00020 \$schema->
00021 addTable(
00022 DBTable::create('{$tableName}')->
00023
00024 EOT;
00025
00026 $columns = array();
00027
00028 foreach ($propertyList as $property) {
00029 if (
00030 $property->getRelation()
00031 && ($property->getRelationId() != MetaRelation::ONE_TO_ONE)
00032 ) {
00033 continue;
00034 }
00035
00036 $column = $property->toColumn();
00037
00038 if (is_array($column))
00039 $columns = array_merge($columns, $column);
00040 else
00041 $columns[] = $property->toColumn();
00042 }
00043
00044 $out .= implode("->\n", $columns);
00045
00046 return $out."\n);\n\n";
00047 }
00048
00049 public static function buildRelations(MetaClass $class)
00050 {
00051 $out = null;
00052
00053 $knownJunctions = array();
00054
00055 foreach ($class->getAllProperties() as $property) {
00056 if ($relation = $property->getRelation()) {
00057
00058 $foreignClass = $property->getType()->getClass();
00059
00060 if (
00061 $relation->getId() == MetaRelation::ONE_TO_MANY
00062
00063
00064 || !$foreignClass->getPattern()->tableExists()
00065
00066 || $class->getParent()
00067 ) {
00068 continue;
00069 } elseif (
00070 $relation->getId() == MetaRelation::MANY_TO_MANY
00071 ) {
00072 $tableName =
00073 $class->getTableName()
00074 .'_'
00075 .$foreignClass->getTableName();
00076
00077 if (isset($knownJunctions[$tableName]))
00078 continue;
00079 else
00080 $knownJunctions[$tableName] = true;
00081
00082 $foreignPropery = clone $foreignClass->getIdentifier();
00083
00084 $name = $class->getName();
00085 $name = strtolower($name[0]).substr($name, 1);
00086 $name .= 'Id';
00087
00088 $foreignPropery->
00089 setName($name)->
00090 setColumnName($foreignPropery->getConvertedName())->
00091
00092 setIdentifier(false);
00093
00094
00095 $property = clone $property;
00096 $property->required();
00097
00098
00099 if (
00100 $property->getRelationColumnName()
00101 == $foreignPropery->getColumnName()
00102 ) {
00103 $foreignPropery->setColumnName(
00104 $class->getTableName().'_'
00105 .$property->getConvertedName().'_id'
00106 );
00107 }
00108
00109 $out .= <<<EOT
00110 \$schema->
00111 addTable(
00112 DBTable::create('{$tableName}')->
00113 {$property->toColumn()}->
00114 {$foreignPropery->toColumn()}->
00115 addUniques('{$property->getRelationColumnName()}', '{$foreignPropery->getColumnName()}')
00116 );
00117
00118
00119 EOT;
00120 } else {
00121 $sourceTable = $class->getTableName();
00122 $sourceColumn = $property->getRelationColumnName();
00123
00124 $targetTable = $foreignClass->getTableName();
00125 $targetColumn = $foreignClass->getIdentifier()->getColumnName();
00126
00127 $out .= <<<EOT
00128
00129 \$schema->
00130 getTableByName('{$sourceTable}')->
00131 getColumnByName('{$sourceColumn}')->
00132 setReference(
00133 \$schema->
00134 getTableByName('{$targetTable}')->
00135 getColumnByName('{$targetColumn}'),
00136 ForeignChangeAction::restrict(),
00137 ForeignChangeAction::cascade()
00138 );
00139
00140
00141 EOT;
00142
00143 }
00144 }
00145 }
00146
00147 return $out;
00148 }
00149
00150 public static function getHead()
00151 {
00152 $out = parent::getHead();
00153
00154 $out .= "\$schema = new DBSchema();\n\n";
00155
00156 return $out;
00157 }
00158 }
00159 ?>