function system_update_8901
Same name in other branches
- 8.9.x core/modules/system/system.install \system_update_8901()
Update the stored schema data for entity identifier fields.
File
-
core/
modules/ system/ system.install, line 1550
Code
function system_update_8901() {
$definition_update_manager = \Drupal::entityDefinitionUpdateManager();
$entity_type_manager = \Drupal::entityTypeManager();
$installed_storage_schema = \Drupal::keyValue('entity.storage_schema.sql');
foreach ($definition_update_manager->getEntityTypes() as $entity_type_id => $entity_type) {
// Ensure that we are dealing with a non-deleted entity type that uses the
// default SQL storage.
if (!$entity_type_manager->hasDefinition($entity_type_id)) {
continue;
}
$storage = $entity_type_manager->getStorage($entity_type_id);
if (!$storage instanceof SqlContentEntityStorage) {
continue;
}
foreach ([
'id',
'revision',
] as $key) {
if (!$entity_type->hasKey($key)) {
continue;
}
$field_name = $entity_type->getKey($key);
$field_storage_definition = $definition_update_manager->getFieldStorageDefinition($field_name, $entity_type_id);
if (!$field_storage_definition) {
continue;
}
if ($field_storage_definition->getType() !== 'integer') {
continue;
}
// Retrieve the storage schema in order to use its own method for updating
// the identifier schema - ::processIdentifierSchema(). This is needed
// because some storage schemas might not use serial identifiers.
// @see \Drupal\user\UserStorageSchema::processIdentifierSchema()
$ref_get_storage_schema = new \ReflectionMethod($storage, 'getStorageSchema');
$ref_get_storage_schema->setAccessible(TRUE);
$storage_schema = $ref_get_storage_schema->invoke($storage);
if ($storage_schema instanceof SqlContentEntityStorageSchema) {
$field_schema_data = $installed_storage_schema->get($entity_type_id . '.field_schema_data.' . $field_storage_definition->getName(), []);
$table = $key === 'id' ? $entity_type->getBaseTable() : $entity_type->getRevisionTable();
$ref_process_identifier_schema = new \ReflectionMethod($storage_schema, 'processIdentifierSchema');
$ref_process_identifier_schema->setAccessible(TRUE);
$ref_process_identifier_schema->invokeArgs($storage_schema, [
&$field_schema_data[$table],
$field_name,
]);
$installed_storage_schema->set($entity_type_id . '.field_schema_data.' . $field_storage_definition->getName(), $field_schema_data);
}
}
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.