/** * Change column from null to not null * @param Field $field */ public function changeFieldType($field) { if (!$field->getRecastCallback()) { throw new Exception("Unable to recast value as recast callback was not set for field '" . $field->getName() . "'"); } $builder = PerfORMController::getBuilder('fieldretype'); $tmpfield = $field->getName() . '_' . md5(time()); $template = $builder->getTemplate('field-add'); $fieldInfo = $builder->getField($field); $fieldInfo->name = $tmpfield; $fieldInfo->nullable = true; $template->field = $fieldInfo; PerfORMController::getBuilder()->addToBuffer($builder->renderTemplate($template), 'alters'); //PerfORMController::getConnection()->nativeQuery($sql); $result = PerfORMController::getConnection()->query('select * from %n', $field->getModel()->getTableName()); $pk = $field->getModel()->getPrimaryKey(); foreach ($result as $row) { if (is_callable($field->getRecastCallback())) { $value = call_user_func($field->getRecastCallback(), $row); if (!$field->isNullable() and is_null($value)) { throw new Exception("Unable to recast null value for field '" . $field->getName() . "' (id=" . $row->{$pk} . ") as field is not null"); } } else { throw new Exception("Unable to recast value for field '" . $field->getName() . "' (id=" . $row->{$pk} . ")"); } $sql = PerfORMController::getConnection()->sql('update %n set %n = %' . $field->getType() . ' where %n = %i;', $field->getModel()->getTableName(), $tmpfield, $value, $pk, $row->{$pk}); PerfORMController::getBuilder()->addToBuffer($sql, 'alters'); } if (!$field->isNullable()) { $fieldInfo->nullable = false; $template = $builder->getTemplate('field-change-nullable'); $template->field = $fieldInfo; $sql = $builder->renderTemplate($template); PerfORMController::getBuilder()->addToBuffer($sql, 'alters'); //PerfORMController::getConnection()->nativeQuery($sql); } PerfORMController::getBuilder()->dropField($field->getName(), $field->getModel()); PerfORMController::getBuilder()->renameField($field, $tmpfield); $this->updateFieldSync($field); }