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 @@ -482,6 +482,7 @@ return []; } + $storage_definitions = $this->entityManager->getFieldStorageDefinitions($this->entityTypeId); $values = []; foreach ($records as $id => $record) { $values[$id] = []; @@ -493,12 +494,17 @@ // that store several properties). if ($field_name = strstr($name, '__', TRUE)) { $property_name = substr($name, strpos($name, '__') + 2); - $values[$id][$field_name][LanguageInterface::LANGCODE_DEFAULT][$property_name] = $value; + $storage_definition = $storage_definitions[$field_name]; + $definition_columns = $storage_definition->getColumns(); + $values[$id][$field_name][LanguageInterface::LANGCODE_DEFAULT][$property_name] = !empty($definition_columns[$property_name]['serialize']) ? unserialize($value) : $value; } else { // Handle columns named directly after the field (e.g if the field // type only stores one property). - $values[$id][$name][LanguageInterface::LANGCODE_DEFAULT] = $value; + $storage_definition = $storage_definitions[$name]; + $columns = $storage_definition->getColumns(); + $column = reset($columns); + $values[$id][$name][LanguageInterface::LANGCODE_DEFAULT] = !empty($column['serialize']) ? unserialize($value) : $value; } } } @@ -551,7 +557,6 @@ $all_fields = $table_mapping->getFieldNames($this->dataTable); } - $storage_definitions = $this->entityManager->getFieldStorageDefinitions($this->entityTypeId); $result = $query->execute(); foreach ($result as $row) { $id = $row[$record_key]; @@ -563,19 +568,14 @@ $translations[$id][$langcode] = TRUE; foreach ($all_fields as $field_name) { - $storage_definition = $storage_definitions[$field_name]; - $definition_columns = $storage_definition->getColumns(); $columns = $table_mapping->getColumnNames($field_name); // Do not key single-column fields by property name. if (count($columns) == 1) { - $column_name = reset($columns); - $column_attributes = $definition_columns[key($columns)]; - $values[$id][$field_name][$langcode] = (!empty($column_attributes['serialize'])) ? unserialize($row[$column_name]) : $row[$column_name]; + $values[$id][$field_name][$langcode] = $row[reset($columns)]; } else { foreach ($columns as $property_name => $column_name) { - $column_attributes = $definition_columns[$property_name]; - $values[$id][$field_name][$langcode][$property_name] = (!empty($column_attributes['serialize'])) ? unserialize($row[$column_name]) : $row[$column_name]; + $values[$id][$field_name][$langcode][$property_name] = $row[$column_name]; } } } @@ -590,6 +590,7 @@ $all_fields = $table_mapping->getFieldNames($this->dataTable); } + $storage_definitions = $this->entityManager->getFieldStorageDefinitions($this->entityTypeId); $result = $query->execute(); foreach ($result as $row) { $id = $row[$record_key]; @@ -601,14 +602,19 @@ $translations[$id][$langcode] = TRUE; foreach ($all_fields as $field_name) { + $storage_definition = $storage_definitions[$field_name]; + $definition_columns = $storage_definition->getColumns(); $columns = $table_mapping->getColumnNames($field_name); // Do not key single-column fields by property name. if (count($columns) == 1) { - $values[$id][$field_name][$langcode] = $row[reset($columns)]; + $column_name = reset($columns); + $column_attributes = $definition_columns[key($columns)]; + $values[$id][$field_name][$langcode] = (!empty($column_attributes['serialize'])) ? unserialize($row[$column_name]) : $row[$column_name]; } else { foreach ($columns as $property_name => $column_name) { - $values[$id][$field_name][$langcode][$property_name] = $row[$column_name]; + $column_attributes = $definition_columns[$property_name]; + $values[$id][$field_name][$langcode][$property_name] = (!empty($column_attributes['serialize'])) ? unserialize($row[$column_name]) : $row[$column_name]; } } }