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; }