Часто бывает ситуация, что нужно увеличить длину текстового поля, а в БД уже есть данные. Друпал не дает этого сделать
Чтобы изменить длину поля, нужно выполнить 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();
}
?>