Skip to main content
Drupal code

Main navigation

  • Home
  • Snippets
User account menu
  • Log in

Breadcrumb

  1. Home

Change existing field type

By admin , 28 March, 2024

Tags

  • field
$entityType = 'node';
$fieldName = 'field_myfield';
$new_type = 'text_long';
$database = \Drupal::database();
$table = $entityType . '__' . $fieldName;
$rev_table = $entityType . '_revision__' . $fieldName;
$currentRows = NULL;
$newFieldsList = [];
$fieldStorage = FieldStorageConfig::loadByName($entityType, $fieldName);
if (is_null($fieldStorage)) {
 return;
}
// Get all current data from DB.
if ($database->schema()->tableExists($table)) {
 // The table data to restore after the update is completed.
 $currentRows = $database->select($table, 'n')
   ->fields('n')
   ->execute()
   ->fetchAll();
}
// Add for revisions table as well.
if ($database->schema()->tableExists($rev_table)) {
 // The table data to restore after the update is completed.
 $currentRevRows = $database->select($rev_table, 'n')
   ->fields('n')
   ->execute()
   ->fetchAll();
}
// Use existing field config for new field.
foreach ($fieldStorage->getBundles() as $bundle => $label) {
 $field = FieldConfig::loadByName($entityType, $bundle, $fieldName);
 $newField = $field->toArray();
 $newField['field_type'] = $new_type;
 $newField['settings'] = [];
 $newFieldsList[] = $newField;
}
// Deleting field storage which will also delete bundles(fields).
$newFieldStorage = $fieldStorage->toArray();
$newFieldStorage['type'] = $new_type;
$newFieldStorage['settings'] = [];
$fieldStorage->delete();
// Purge field data now to allow new field and field_storage with same name
// to be created.
field_purge_batch(50);
// Create new field storage.
$newFieldStorage = FieldStorageConfig::create($newFieldStorage);
$newFieldStorage->save();
// Create new fields.
foreach ($newFieldsList as $nfield) {
 $nfieldConfig = FieldConfig::create($nfield);
 $nfieldConfig->save();
}
// Restore existing data in new table.
if (!is_null($currentRows)) {
 foreach ($currentRows as $row) {
   $database->insert($table)
     ->fields((array) $row)
     ->execute();
 }
}
// And restore existing data in new Revisions table.
if (!is_null($currentRevRows)) {
 foreach ($currentRevRows as $row) {
   $database->insert($rev_table)
     ->fields((array) $row)
     ->execute();
 }
}

Tags Cloud

dependency injection(21) form(18) drush(14) views(11) twig(11) preprocess(9) field(8) node(7) translate(7) render(6) tabs(6) controller(5) config(5) phpstorm(5) file(5) entityTypeManager(5) routes(5) comment(4) database(4) jquery(4) service(4) roles(4) phpunit(3) php(3) cache(3) entity(3) slick(3) block(3) custom entity(3) javascript(3) user(3) taxonomy(3) guzzle(3) url(3) phpstan(2) event(2) commerce(2) template(2) schema(2) migration(2) libraries(2) date(2) access(2) ajax(2) photoswipe(2) permissions(2) logger(2) vscode(2) suggestions(2) states(2) title(2) fieldset(2) redirect(2) mysql(2) git(1) request(1) attribute(1) service provider(1) csv(1) PHPDoc(1) table(1) eslint(1) deprecation(1) theme(1) errors(1) wsod(1) settings.php(1) watchdog(1) pager(1) widget(1) module(1) file.usage(1) queue(1) exif(1) imagemagick(1) image(1) media(1) uuid(1) drupal.org(1) tests(1) renderer(1) array(1) exposed form(1) page manager(1) transliteration(1) random(1) entityQuery(1) development(1) mail(1) webform(1) register(1) textarea(1) label(1) input(1) batch(1) import(1) messenger(1)
RSS feed
Powered by Drupal