public function __construct(array $createStatementLines, $tableName, Garp_Spawn_Model_Abstract $model) { $this->setTableName($tableName); $this->_model = $model; foreach ($createStatementLines as $line) { if (Garp_Spawn_MySql_ForeignKey::isForeignKeyStatement($line)) { $this->foreignKeys[] = new Garp_Spawn_MySql_ForeignKey($line); } elseif (Garp_Spawn_MySql_UniqueKey::isUniqueKeyStatement($line)) { $this->uniqueKeys[] = new Garp_Spawn_MySql_UniqueKey($line); } elseif (Garp_Spawn_MySql_PrimaryKey::isPrimaryKeyStatement($line)) { $this->primaryKey = new Garp_Spawn_MySql_PrimaryKey($line); } } // now retrieve index keys, excluding foreign keys foreach ($createStatementLines as $line) { if (Garp_Spawn_MySql_IndexKey::isIndexKeyStatement($line, $this->foreignKeys)) { $this->indices[] = new Garp_Spawn_MySql_IndexKey($line); } } }
/** * Abstract method to render a CREATE TABLE statement. * @param String $modelId The table name, usually the Model ID. * @param Array $fields Numeric array of Garp_Spawn_Field objects. * @param Array $relations Associative array, where the key is the name * of the relation, and the value a Garp_Spawn_Relation object, * or at least an object with properties column, model, type. * @param Array $unique (optional) List of column names to be combined into a unique id. * This is model-wide and supersedes the 'unique' property per field. */ protected function _renderCreateAbstract($tableName, array $fields, array $relations, $unique) { $lines = array(); foreach ($fields as $field) { $lines[] = Garp_Spawn_MySql_Column::renderFieldSql($field); } $primKeys = array(); $uniqueKeys = array(); if ($unique) { // This checks wether a single one-dimensional array is given: a collection of // columns combined into a unique key, or wether an array of arrays is given, meaning // multiple collections of columns combining into multiple unique keys per table. $isArrayOfArrays = count(array_filter($unique, 'is_array')) === count($unique); $unique = !$isArrayOfArrays ? array($unique) : $unique; $uniqueKeys = array_merge($uniqueKeys, $unique); } foreach ($fields as $field) { if ($field->primary) { $primKeys[] = $field->name; } if ($field->unique) { $uniqueKeys[] = $field->name; } } if ($primKeys) { $lines[] = Garp_Spawn_MySql_PrimaryKey::renderSqlDefinition($primKeys); } foreach ($uniqueKeys as $fieldName) { $lines[] = Garp_Spawn_MySql_UniqueKey::renderSqlDefinition($fieldName); } foreach ($relations as $rel) { if (($rel->type === 'hasOne' || $rel->type === 'belongsTo') && !$rel->multilingual) { $lines[] = Garp_Spawn_MySql_IndexKey::renderSqlDefinition($rel->column); } } // set indices that were configured in the Spawn model config foreach ($fields as $field) { if ($field->index) { $lines[] = Garp_Spawn_MySql_IndexKey::renderSqlDefinition($field->name); } } foreach ($relations as $relName => $rel) { if (($rel->type === 'hasOne' || $rel->type === 'belongsTo') && !$rel->multilingual) { $fkName = Garp_Spawn_MySql_ForeignKey::generateForeignKeyName($tableName, $relName); $lines[] = Garp_Spawn_MySql_ForeignKey::renderSqlDefinition($fkName, $rel->column, $rel->model, $rel->type); } } $out = "CREATE TABLE `{$tableName}` (\n"; $out .= implode(",\n", $lines); $out .= "\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;"; return $out; }
protected function _ifNullableChangesThenDeleteForeignKeys(Garp_Spawn_MySql_Column $sourceColumn, array $diffProperties) { $source = $this->getSource(); if (in_array('nullable', $diffProperties)) { foreach ($source->keys->foreignKeys as $fk) { if ($fk->localColumn === $sourceColumn->name) { Garp_Spawn_MySql_ForeignKey::delete($source->name, $fk); $source->keys->droppedForeignKeyNamesDuringColumnSync[] = $fk->name; break; } } } }
protected function _removeForeignKeys(array $keysToRemove) { $tableName = $this->getSource()->getTableName(); foreach ($keysToRemove as $key) { if (!(in_array($key->name, $this->droppedForeignKeyNamesDuringColumnSync) || Garp_Spawn_MySql_ForeignKey::delete($tableName, $key))) { throw new Exception("Could not delete '{$key->localColumn}' foreign key."); } } }