diff -u b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php --- b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php +++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php @@ -665,24 +665,24 @@ // If a revision table is available, we need all the properties of the // latest revision. Otherwise we fall back to the data table. $table = $this->revisionDataTable ?: $this->dataTable; - $query = $this->database->select($table, 'data', array('fetch' => \PDO::FETCH_ASSOC)) - ->fields('data') - ->condition('data.' . $this->idKey, array_keys($entities)) - ->orderBy('data.' . $this->idKey); + $alias = $this->revisionDataTable ? 'revision' : 'data'; + $query = $this->database->select($table, $alias, array('fetch' => \PDO::FETCH_ASSOC)) + ->fields($alias) + ->condition($alias . '.' . $this->idKey, array_keys($entities)) + ->orderBy($alias . '.' . $this->idKey); $table_mapping = $this->getTableMapping(); - $translations = array(); - if ($this->revisionDataTable) { - $data_fields = array_diff($table_mapping->getFieldNames($this->revisionDataTable), $table_mapping->getFieldNames($this->baseTable)); + // Find revisioned fields that are non-entity ID's + $fields = array_diff($table_mapping->getFieldNames($this->revisionDataTable), $table_mapping->getFieldNames($this->baseTable)); - // Are there any fields unique to dataTable, that are not IDs or revisionable? - $data_fields_static = array_diff($table_mapping->getFieldNames($this->dataTable), $table_mapping->getFieldNames($this->revisionDataTable), $table_mapping->getFieldNames($this->baseTable)); - if ($data_fields_static) { - $data_fields = array_merge($data_fields, $data_fields_static); - - $query->leftJoin($this->dataTable, 'static', "(data.$this->idKey = static.$this->idKey)"); - $query->fields('static', $data_fields_static); + // Find fields that are non-revisioned and non ID's. The value of + // data fields are persistent regardless of entity revision. + $data_fields = array_diff($table_mapping->getFieldNames($this->dataTable), $fields, $table_mapping->getFieldNames($this->baseTable)); + if ($data_fields) { + $fields = array_merge($fields, $data_fields); + $query->leftJoin($this->dataTable, 'data', "(revision.$this->idKey = data.$this->idKey)"); + $query->fields('data', $data_fields); } // Get the revision IDs. @@ -690,12 +690,13 @@ foreach ($entities as $values) { $revision_ids[] = is_object($values) ? $values->getRevisionId() : $values[$this->revisionKey][LanguageInterface::LANGCODE_DEFAULT]; } - $query->condition('data.' . $this->revisionKey, $revision_ids); + $query->condition('revision.' . $this->revisionKey, $revision_ids); } else { - $data_fields = $table_mapping->getFieldNames($this->dataTable); + $fields = $table_mapping->getFieldNames($this->dataTable); } + $translations = array(); $data = $query->execute(); foreach ($data as $values) { $id = $values[$this->idKey]; @@ -706,7 +707,7 @@ $translations[$id][$langcode] = TRUE; - foreach ($data_fields as $field_name) { + foreach ($fields as $field_name) { $columns = $table_mapping->getColumnNames($field_name); // Do not key single-column fields by property name. if (count($columns) == 1) { diff -u b/core/modules/serialization/src/Tests/EntitySerializationTest.php b/core/modules/serialization/src/Tests/EntitySerializationTest.php --- b/core/modules/serialization/src/Tests/EntitySerializationTest.php +++ b/core/modules/serialization/src/Tests/EntitySerializationTest.php @@ -59,7 +59,7 @@ 'value' => $this->randomMachineName(), 'format' => 'full_html', ), - 'nonrevisioned' => 33, + 'persistent' => 33, ); $this->entity = entity_create('entity_test_mulrev', $this->values); $this->entity->save(); @@ -101,8 +101,8 @@ 'format' => $this->values['field_test_text']['format'], ), ), - 'nonrevisioned' => array( - array('value' => $this->values['nonrevisioned']), + 'persistent' => array( + array('value' => $this->values['persistent']), ), ); @@ -156,7 +156,7 @@ 'user_id' => '' . $this->values['user_id'] . '', 'revision_id' => '' . $this->entity->getRevisionId() . '', 'field_test_text' => '' . $this->values['field_test_text']['value'] . '' . $this->values['field_test_text']['format'] . '', - 'nonrevisioned' => '' . $this->values['nonrevisioned'] . '', + 'persistent' => '' . $this->values['persistent'] . '', ); // Sort it in the same order as normalised. $expected = array_merge($normalized, $expected); diff -u b/core/modules/system/src/Tests/Entity/EntityRevisionsTest.php b/core/modules/system/src/Tests/Entity/EntityRevisionsTest.php --- b/core/modules/system/src/Tests/Entity/EntityRevisionsTest.php +++ b/core/modules/system/src/Tests/Entity/EntityRevisionsTest.php @@ -57,7 +57,7 @@ $entity = entity_create($entity_type, array( 'name' => 'foo', 'user_id' => $this->web_user->id(), - 'nonrevisioned' => $this->randomMachineName(32), + 'persistent' => $this->randomMachineName(32), )); $entity->field_test_text->value = 'bar'; $entity->save(); @@ -65,7 +65,7 @@ $names = array(); $texts = array(); $revision_ids = array(); - $nonrevisioned = 0; + $persistent = 0; // Create three revisions. $revision_count = 3; @@ -78,7 +78,7 @@ $entity->setNewRevision(TRUE); $names[] = $entity->name->value = $this->randomMachineName(32); $texts[] = $entity->field_test_text->value = $this->randomMachineName(32); - $nonrevisioned = $entity->nonrevisioned->value = $i * 2; + $persistent = $entity->persistent->value = $i * 2; $entity->save(); $revision_ids[] = $entity->revision_id->value; @@ -97,9 +97,9 @@ $this->assertEqual($entity_revision->name->value, $names[$i], format_string('%entity_type: Name matches.', array('%entity_type' => $entity_type))); $this->assertEqual($entity_revision->field_test_text->value, $texts[$i], format_string('%entity_type: Text matches.', array('%entity_type' => $entity_type))); - // Check 'data_table' values are loaded. - $this->assertTrue(isset($entity_revision->nonrevisioned->value), format_string('%entity_type: Non-revisioned field is loaded.', array('%entity_type' => $entity_type))); - $this->assertEqual($entity_revision->nonrevisioned->value, $nonrevisioned, format_string('%entity_type: Non-revisioned field value is the same across revisions.', array('%entity_type' => $entity_type))); + // Check non-revisioned values are loaded. + $this->assertTrue(isset($entity_revision->persistent->value), format_string('%entity_type: Non-revisioned field is loaded.', array('%entity_type' => $entity_type))); + $this->assertEqual($entity_revision->persistent->value, $persistent, format_string('%entity_type: Non-revisioned field value is the same between revisions.', array('%entity_type' => $entity_type))); } // Confirm the correct revision text appears in the edit form. diff -u b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php --- b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php +++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTest.php @@ -120,10 +120,11 @@ ), )); - $fields['nonrevisioned'] = BaseFieldDefinition::create('integer') - ->setLabel(t('Foo')) - ->setReadOnly(TRUE) - ->setRevisionable(FALSE); + // Create a non-revisioned field. + $fields['persistent'] = BaseFieldDefinition::create('integer') + ->setLabel(t('Persistent')) + ->setDescription(t('A field that does not have different values between revisions.')) + ->setReadOnly(TRUE); return $fields; }