コード例 #1
0
 protected function updateTableFields()
 {
     if (array_key_exists('saveFields', $this->dirty)) {
         if ($this->dirty['saveFields'] == true) {
             $this->saveFields();
         }
     }
     $dataLink = $this->application->dataLink;
     $insertStrings = array();
     $indexStrings = array();
     foreach ($this->addedFieldIds as $id) {
         $referenceField = new bmReferenceField($this->application, array('identifier' => $id));
         $tableFieldName = $referenceField->dataType == BM_VT_OBJECT ? $referenceField->fieldName . 'Id' : $referenceField->fieldName;
         $insertStrings[] = 'ADD COLUMN `' . $tableFieldName . '` ' . $dataLink->ffTypeToNativeType($referenceField->dataType, $referenceField->defaultValue);
         $key = $this->searchItem($id, 'referenceFieldId', $this->properties['fieldIds']);
         $typeMigrate = 4;
         if ($key !== false) {
             $item = $this->properties['fieldIds'][$key];
             $typeMigrate = $item->type;
             if (in_array($item->type, array(1, 2))) {
                 $indexStrings[] = 'ADD INDEX `' . $tableFieldName . '` (`' . $tableFieldName . '`)';
             }
         }
         if ($this->migration) {
             $this->migration->addSql("\n\t\t\t\t\tinsert ignore into\n\t\t\t\t\t\treferenceField\n\t\t\t\t\t\t(`propertyName`, `fieldName`, `dataType`, `localName`, `defaultValue`)\n\t\t\t\t\tvalues\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->propertyName) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->fieldName) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->dataType) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->localName) . ",\n\t\t\t\t\t\t\t" . $dataLink->quoteSmart($referenceField->defaultValue) . "\n\t\t\t\t\t\t)");
             $this->migration->addSql("\n\t\t\t\t\t\tINSERT IGNORE INTO\n\t\t\t\t\t\t\t`link_referenceMap_referenceField`\n\t\t\t\t\t\t\tselect p1.referenceMapId, p2.referenceFieldId, {$typeMigrate} as referenceFieldType from\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tselect id as referenceMapId from `referenceMap` where name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t\t\t\t\t) p1,\n\t\t\t\t\t\t\t\t( select max(id) as referenceFieldId from referenceField ) p2\n\n\n\t\t\t\t");
             if ($typeMigrate !== 4 && array_key_exists('referencedObjectIdMigrate', $this->properties) && array_key_exists($referenceField->fieldName, $this->properties['referencedObjectIdMigrate'])) {
                 $this->migration->addField($this->properties['name'], $referenceField->fieldName . "Id");
                 $this->migration->addCommit("Добавление поля `{$referenceField->fieldName}Id` в связь `{$this->properties['name']}`");
                 $typeText = "дополнительным";
                 if ($typeMigrate === 1) {
                     $typeText = 'главным';
                 } elseif ($typeMigrate === 2) {
                     $typeText = 'зависемое';
                 }
                 $dataObjectMap = new bmDataObjectMap($this->application, ['identifier' => $this->properties['referencedObjectIdMigrate'][$referenceField->fieldName]], null);
                 $this->migration->addCommit("Поле `{$referenceField->fieldName}` {$typeText} в связи `{$this->properties['name']}` для объекта `{$dataObjectMap->name}`");
                 $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\t\t\tINSERT IGNORE INTO\n\t\t\t\t\t\t\t\t\t\t\t\t\t`link_referenceField_dataObjectMap`\n\t\t\t\t\t\t\t\t\t\t\t\tselect p.dataObjectMapId, p1.referenceFieldId from\n\t\t\t\t\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselect id as dataObjectMapId from dataObjectMap where name = " . $dataLink->quoteSmart($dataObjectMap->name) . "\n\t\t\t\t\t\t\t) p,\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tselect\n\t\t\t\t\t\t\t\t\tdof.id as referenceFieldId\n\t\t\t\t\t\t\t\tfrom\n\t\t\t\t\t\t\t\t\treferenceField dof\n\t\t\t\t\t\t\t\t\tinner join link_referenceMap_referenceField ldd on ldd.referenceFieldId = dof.id\n\t\t\t\t\t\t\t\t\tinner join referenceMap dom on dom.id = ldd.referenceMapId\n\t\t\t\t\t\t\t\twhere\n\t\t\t\t\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($referenceField->properties['fieldName']) . "\n\t\t\t\t\t\t\t\t\tand dom.name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t\t\t\t) p1\n\t\t\t\t\t");
             } else {
                 $this->migration->addField($this->properties['name'], $referenceField->fieldName);
                 $this->migration->addCommit("Добавление поля `{$referenceField->fieldName}` в связь `{$this->properties['name']}`");
             }
         }
     }
     if (count($insertStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStrings) . ";";
         $dataLink->query($sql);
         if ($this->migration) {
             $this->migration->addSql($sql);
         }
         $this->application->log->add($sql);
     }
     if (count($indexStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $indexStrings) . ";";
         $dataLink->query($sql);
         if ($this->migration) {
             $this->migration->addSql($sql);
         }
         $this->application->log->add($sql);
     }
     $insertStrings = array();
     foreach ($this->droppedFields as $id => $droppedFieldName) {
         $insertStrings[] = 'DROP COLUMN `' . $droppedFieldName . '`';
         if ($this->migration) {
             $this->migration->addCommit("Удаление поля `{$droppedFieldName}` в связи `{$this->properties['name']}`");
             $this->migration->addSql("\n\t\t\t\t\t\tset @idData = (\n\t\t\t\t\t\t\t\t\tselect dof.id from\n\t\t\t\t\t\t\t\t\t\treferenceField dof\n\t\t\t\t\t\t\t\t\t\tinner join link_referenceMap_referenceField ldd on ldd.referenceFieldId = dof.id\n\t\t\t\t\t\t\t\t\t\tinner join referenceMap dom on dom.id = ldd.referenceMapId\n\t\t\t\t\t\t\t\t\twhere\n\t\t\t\t\t\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($droppedFieldName) . "\n\t\t\t\t\t\t\t\t\t\tand dom.name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t\t\t)");
             $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\tDELETE FROM\n\t\t\t\t\t\t\t\t\t\t\t\t\t`link_referenceField_dataObjectMap`\n\t\t\t\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t\t\t\t`referenceFieldId` = @idData\n\t\t\t\t\t\t\t\t\t\t");
             $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\tdelete from\n\t\t\t\t\t\t\t\t\t\t\t`referenceField`\n\t\t\t\t\t\t\t\t\t\twhere\n\t\t\t\t\t\t\t\t\t\t\t`id` = @idData\n\t\t\t\t\t\t\t\t\t\t\t");
             $this->migration->addSql("\n\t\t\t\t\t\t\t\t\t\t\t\tDELETE FROM\n\t\t\t\t\t\t\t\t\t\t\t\t\t`link_referenceMap_referenceField`\n\t\t\t\t\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\t\t\t\t\t`referenceMapId` = (select id as referenceMapId from `referenceField` where name = " . $dataLink->quoteSmart($this->properties['name']) . ")\n\t\t\t\t\t\t\t\tand `referenceFieldId` = @idData\n\t\t\t\t\t\t");
         }
     }
     if (count($insertStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStrings) . ";";
         $dataLink->query($sql);
         if ($this->migration) {
             $this->migration->addSql($sql);
         }
         $this->application->log->add($sql);
     }
     $insertStrings = $insertStringsMigrate = array();
     foreach ($this->renamedFields as $item) {
         $referenceField = new bmReferenceField($this->application, array('identifier' => $item->fieldId));
         $tableFieldName = $referenceField->dataType == BM_VT_OBJECT ? $referenceField->fieldName . 'Id' : $referenceField->fieldName;
         if (property_exists($item, 'oldFieldName')) {
             $oldTableFieldName = $referenceField->dataType == BM_VT_OBJECT ? $item->oldFieldName . 'Id' : $item->oldFieldName;
         } else {
             $oldTableFieldName = $tableFieldName;
         }
         $insertStrings[] = ' CHANGE `' . $oldTableFieldName . '` `' . $tableFieldName . '` ' . $dataLink->ffTypeToNativeType($referenceField->dataType, $referenceField->defaultValue);
         if ($this->migration && array_key_exists('oldReferenceField', $this->properties) && array_key_exists($oldTableFieldName, $this->properties['oldReferenceField']) && !$referenceField->compere($this->properties['oldReferenceField'][$oldTableFieldName])) {
             $insertStringsMigrate[] = ' CHANGE `' . $oldTableFieldName . '` `' . $tableFieldName . '` ' . $dataLink->ffTypeToNativeType($referenceField->dataType, $referenceField->defaultValue);
             $this->migration->addCommit("Переименование поля `{$oldTableFieldName}` в `{$referenceField->fieldName}`, в связи `{$this->properties['name']}`");
             $this->migration->addSql("\n\t\t\t\t\tupdate\n\t\t\t\t\t\treferenceField dof\n\t\t\t\t\t\tinner join link_referenceMap_referenceField ldd on ldd.referenceFieldId = dof.id\n\t\t\t\t\t\tinner join referenceMap dom on dom.id = ldd.referenceMapId\n\t\t\t\t\tset\n\t\t\t\t\t\tdof.propertyName = " . $dataLink->quoteSmart($referenceField->propertyName) . ",\n\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($referenceField->fieldName) . ",\n\t\t\t\t\tdof.dataType = " . $dataLink->quoteSmart($referenceField->dataType) . ",\n\t\t\t\t\tdof.localName = " . $dataLink->quoteSmart($referenceField->localName) . ",\n\t\t\t\t\tdof.defaultValue = " . $dataLink->quoteSmart($referenceField->defaultValue) . "\n\t\t\t\twhere\n\t\t\t\t\tdof.fieldName = " . $dataLink->quoteSmart($oldTableFieldName) . "\n\t\t\t\t\tand dom.name = " . $dataLink->quoteSmart($this->properties['name']) . "\n\t\t\t\t");
         }
     }
     if (count($insertStrings) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStrings) . ";";
         $dataLink->query($sql);
         $this->application->log->add($sql);
     }
     if ($this->migration && count($insertStringsMigrate) > 0) {
         $sql = "ALTER TABLE\n                  `" . $this->name . "`" . implode(', ', $insertStringsMigrate) . ";";
         $this->migration->addSql($sql);
     }
     $this->addedFieldIds = array();
     $this->droppedFieldIds = array();
     $this->renamedFields = array();
     $this->dirty['updateTableFields'] = false;
 }