Как увеличить длину текстового поля, если в БД уже есть данные

Часто бывает ситуация, что нужно увеличить длину текстового поля, а в БД уже есть данные. Друпал не дает этого сделать

Чтобы изменить длину поля, нужно выполнить 3 операции:

  1. Изменить длину поля в самой БД
  2. Обновить схему поля, чтобы она соотносилась с длиной поля в БД
  3. Обновить конфиг поля

Можно использовать универсальный код, где достаточно только поменять имя поля

<?php

use Drupal\field\Entity\FieldStorageConfig;

/**
 * Update field_description field.
 */
function mymodule_update_9001(): void {
  
$entity_type 'node';
  
$field_name 'field_description';
  
$field_length 255;

  

$database = \Drupal::database();
  
$database->query("ALTER TABLE {$entity_type}__{$field_name} MODIFY {$field_name}_value VARCHAR({$field_length})");
  
$database->query("ALTER TABLE {$entity_type}_revision__{$field_name} MODIFY {$field_name}_value VARCHAR({$field_length})");

  

$storage_key $entity_type '.field_schema_data.' $field_name;
  
$storage_schema = \Drupal::keyValue('entity.storage_schema.sql');
  
$field_schema $storage_schema->get($storage_key);
  
$field_schema[$entity_type '__' $field_name]['fields'][$field_name '_value']['length'] = $field_length;
  
$field_schema[$entity_type '_revision__' $field_name]['fields'][$field_name '_value']['length'] = $field_length;
  
$storage_schema->set($storage_key$field_schema);

  

$config = \Drupal::configFactory()
    ->
getEditable("field.storage.{$entity_type}.{$field_name}");
  
$config->set('settings.max_length'$field_length);
  
$config->save(TRUE);

  

FieldStorageConfig::loadByName($entity_type$field_name)->save();
}
?>

Автор

ivnish Drupal FullStack Developer, модератор drupal.ru