/** * @return int */ public function upgrade() { $change_column_num = 0; $table_name = $this->getTableName(); $columns = $this->getDBColumns(); $index_columns = $this->getIndexColumns(); $reference_columns = $this->getDBReferenceColumn(); if ($this->db->checkTableExists($table_name)) { $results = $this->db->getTableColumns($table_name); $results_index = $this->db->getTableIndex($table_name); //$results_foreignkey = $this->db->getTableForeignKey($table_name); $add_columns = array(); $add_index_columns = array(); $change_columns = array(); $delete_columns = array(); $delete_indexs = array(); $delete_foreignkey = array(); $columns_keys = array_keys($columns); foreach ($columns as $k => $v) { if (isset($results[$k])) { if (!$v->isEqual($results[$k])) { $change_columns[$k] = $v; } } else { $add_columns[$k] = $v; } } foreach ($results as $k => $v) { if (!isset($columns[$k])) { $delete_columns[$k] = $v; } } foreach ($index_columns as $k => $v) { if (isset($results_index[$k])) { //$change_columns[$k] = $v; } else { $add_index_columns[$k] = $v; } } foreach ($results_index as $k) { if ($k == "PRIMARY") { continue; } if (preg_match('/^(.+_fk)$/', $k, $matchs)) { if (!preg_match('/^(.+)_(.+_fk)$/', $matchs[1], $mt) || !isset($reference_columns[$mt[2]])) { $delete_foreignkey[$k] = $k; } continue; } if (!isset($index_columns[$k])) { $delete_indexs[$k] = $k; } } // update foreach ($delete_foreignkey as $k) { if ($this->db->dropForeignKey($table_name, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($delete_columns as $k => $v) { if ($this->db->alterTableDrop($table_name, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($delete_indexs as $k => $v) { if ($this->db->alterTableDropIndex($table_name, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($change_columns as $k => $v) { if ($this->db->alterTableChange($table_name, $k, $v, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($add_columns as $k => $v) { $current_key = array_search($k, $columns_keys); if ($this->db->alterTableAdd($table_name, $k, $v, $current_key > 0 ? $this->db->escapeColumn($columns_keys[$current_key - 1]) : "FIRST") && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($add_index_columns as $k => $v) { if ($this->db->alterTableAddIndex($table_name, $v->generateName(), $v->getFields()) && $this->db->affectedRows() > 0) { $change_column_num++; } } // update callback $this->modelUpdate(); } else { if ($result = $this->db->createTable($table_name, $columns, $this->table_options) && $this->db->affectedRows() > 0) { $change_column_num++; } // update callback $this->modelUpdate(); } return $change_column_num; }