diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php index dc63033..0d89b21 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php @@ -255,10 +255,25 @@ public function loadRevision($revision_id) { public function loadMultipleRevisions(array $revision_ids) { $revisions = $this->doLoadRevisionFieldItems($revision_ids); - // The hooks are invoked keyed by entity ID so we have invoke them for each - // revision. + // The hooks are executed with an array of entities keyed by the entity ID. + // As we could load multiple revisions for the same entity ID at once we + // have to build groups of entities where the same entity ID is present only + // once. + $entity_groups = []; foreach ($revisions as $revision) { - $entities = [$revision->id() => $revision]; + $id = $revision->id(); + foreach ($entity_groups as &$entity_group) { + if (!isset($entity_group[$id])) { + $entity_group[$id] = $revision; + continue 2; + } + } + // If no suitable group has been found then create a new one. + $entity_groups[] = [$id => $revision]; + } + + // Invoke the entity hooks for each group. + foreach ($entity_groups as $entities) { $this->invokeStorageLoadHook($entities); $this->postLoad($entities); }