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