diff --git a/dynamic_entity_reference.install b/dynamic_entity_reference.install index 9b7455c..16e8b1d 100644 --- a/dynamic_entity_reference.install +++ b/dynamic_entity_reference.install @@ -26,11 +26,12 @@ function dynamic_entity_reference_update_8001() { $service = \Drupal::service('dynamic_entity_reference.entity_type_subscriber'); // Only update dynamic_entity_reference fields. foreach ($entity_field_manager->getFieldMapByFieldType('dynamic_entity_reference') as $entity_type_id => $map) { + $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); $entity_storage = $entity_type_manager->getStorage($entity_type_id); // Only SQL storage based entities are supported. if ($entity_storage instanceof SqlEntityStorageInterface) { $field_storage_definitions = $entity_field_manager->getFieldStorageDefinitions($entity_type_id); - /** @var Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ + /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ $table_mapping = $entity_storage->getTableMapping($field_storage_definitions); $field_storage_definition = FALSE; // Only need field storage definitions of dynamic_entity_reference fields. @@ -64,12 +65,22 @@ function dynamic_entity_reference_update_8001() { ]; $type_column = $table_mapping->getFieldColumnName($field_storage_definition, 'target_type'); $schema->changeField($table, $type_column, $type_column, $type_spec); + $revision_table = NULL; + if ($entity_type->isRevisionable() && ($revision_table = $table_mapping->getDedicatedRevisionTableName($field_storage_definition))) { + $schema->changeField($revision_table, $column, $column, $spec); + $schema->changeField($revision_table, $type_column, $type_column, $type_spec); + } // Update the installed storage schema for this field as well. $key = "$entity_type_id.field_schema_data.$field_name"; if ($field_schema_data = $entity_storage_schema_sql->get($key)) { $field_schema_data[$table]['fields'][$column] = $spec; $field_schema_data[$table]['fields'][$type_column] = $type_spec; $entity_storage_schema_sql->set($key, $field_schema_data); + if ($revision_table) { + $field_schema_data[$revision_table]['fields'][$column] = $spec; + $field_schema_data[$revision_table]['fields'][$type_column] = $type_spec; + $entity_storage_schema_sql->set($key, $field_schema_data); + } } if ($table_mapping->allowsSharedTableStorage($field_storage_definition)) { $key = "$entity_type_id.field_storage_definitions"; diff --git a/src/EventSubscriber/FieldStorageSubscriber.php b/src/EventSubscriber/FieldStorageSubscriber.php index 615ae6c..b2f00e0 100644 --- a/src/EventSubscriber/FieldStorageSubscriber.php +++ b/src/EventSubscriber/FieldStorageSubscriber.php @@ -117,6 +117,7 @@ class FieldStorageSubscriber implements EventSubscriberInterface { if ($field_storage_definition) { $der_fields[$entity_type_id][$field_storage_definition->getName()] = TRUE; } + $entity_type = $this->entityTypeManager->getDefinition($entity_type_id); $tables = []; // If we know which field is being created / updated check whether it is // DER. @@ -125,6 +126,7 @@ class FieldStorageSubscriber implements EventSubscriberInterface { if ($field_storage_definition) { $storage_definitions[$field_storage_definition->getName()] = $field_storage_definition; } + /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $mapping */ $mapping = $storage->getTableMapping($storage_definitions); foreach (array_keys($der_fields[$entity_type_id]) as $field_name) { try { @@ -137,6 +139,9 @@ class FieldStorageSubscriber implements EventSubscriberInterface { continue; } $tables[$table][] = $column; + if ($entity_type->isRevisionable() && ($table = $mapping->getDedicatedRevisionTableName($field_storage_definition))) { + $tables[$table][] = $column; + } } $new = []; foreach ($tables as $table => $columns) { diff --git a/tests/src/Kernel/DynamicEntityReferenceFieldRevisionTest.php b/tests/src/Kernel/DynamicEntityReferenceFieldRevisionTest.php index 233eb18..f7c5164 100644 --- a/tests/src/Kernel/DynamicEntityReferenceFieldRevisionTest.php +++ b/tests/src/Kernel/DynamicEntityReferenceFieldRevisionTest.php @@ -58,7 +58,7 @@ class DynamicEntityReferenceFieldRevisionTest extends EntityKernelTestBase { protected function setUp() { parent::setUp(); - $this->installEntitySchema('entity_test_rev'); + $this->installEntitySchema($this->entityType); // Create a field. FieldStorageConfig::create([ @@ -91,6 +91,8 @@ class DynamicEntityReferenceFieldRevisionTest extends EntityKernelTestBase { $field_name = $this->fieldName; $referenced_entity_1 = EntityTest::create(); $referenced_entity_2 = EntityTest::create(); + $referenced_entity_1->save(); + $referenced_entity_2->save(); $storage = $this->container->get('entity_type.manager') ->getStorage($this->entityType); /** @var \Drupal\entity_test\Entity\EntityTestRev $entity */ @@ -120,10 +122,16 @@ class DynamicEntityReferenceFieldRevisionTest extends EntityKernelTestBase { $this->assertEquals($entity_old->id(), $entity_new->id()); $this->assertEquals($entity_old->{$field_name}->target_id, $referenced_entity_1->id()); $this->assertEquals($entity_new->{$field_name}->target_id, $referenced_entity_2->id()); + $storage->resetCache(); $revision_1 = $storage->loadRevision($revision_id_1); $revision_2 = $storage->loadRevision($revision_id_2); $this->assertEquals($revision_1->{$field_name}->target_id, $referenced_entity_1->id()); $this->assertEquals($revision_2->{$field_name}->target_id, $referenced_entity_2->id()); + $database = $this->container->get('database'); + $this->assertEquals([2], $database->query('SELECT field_test_target_id FROM {entity_test_rev__field_test} ORDER BY entity_id, revision_id, delta')->fetchCol()); + $this->assertEquals([2], $database->query('SELECT field_test_target_id_int FROM {entity_test_rev__field_test} ORDER BY entity_id, revision_id, delta')->fetchCol()); + $this->assertEquals([1, 2], $database->query('SELECT field_test_target_id FROM {entity_test_rev_revision__field_test} ORDER BY entity_id, revision_id, delta')->fetchCol()); + $this->assertEquals([1, 2], $database->query('SELECT field_test_target_id_int FROM {entity_test_rev_revision__field_test} ORDER BY entity_id, revision_id, delta')->fetchCol()); } }