Example #1
0
 /**
  * @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;
 }