/** * Maps from an entity object to the storage record. * * @param \Drupal\Core\Entity\ContentEntityInterface $entity * The entity object. * @param string $table_name * (optional) The table name to map records to. Defaults to the base table. * * @return \stdClass * The record to store. */ protected function mapToStorageRecord(ContentEntityInterface $entity, $table_name = NULL) { if (!isset($table_name)) { $table_name = $this->baseTable; } $record = new \stdClass(); $table_mapping = $this->getTableMapping(); foreach ($table_mapping->getFieldNames($table_name) as $field_name) { if (empty($this->getFieldStorageDefinitions()[$field_name])) { throw new EntityStorageException("Table mapping contains invalid field {$field_name}."); } $definition = $this->getFieldStorageDefinitions()[$field_name]; $columns = $table_mapping->getColumnNames($field_name); foreach ($columns as $column_name => $schema_name) { // If there is no main property and only a single column, get all // properties from the first field item and assume that they will be // stored serialized. // @todo Give field types more control over this behavior in // https://www.drupal.org/node/2232427. if (!$definition->getMainPropertyName() && count($columns) == 1) { $value = ($item = $entity->{$field_name}->first()) ? $item->getValue() : array(); } else { $value = isset($entity->{$field_name}->{$column_name}) ? $entity->{$field_name}->{$column_name} : NULL; } if (!empty($definition->getSchema()['columns'][$column_name]['serialize'])) { $value = serialize($value); } // Do not set serial fields if we do not have a value. This supports all // SQL database drivers. // @see https://www.drupal.org/node/2279395 $value = drupal_schema_get_field_value($definition->getSchema()['columns'][$column_name], $value); if (!(empty($value) && $this->isColumnSerial($table_name, $schema_name))) { $record->{$schema_name} = $value; } } } return $record; }
/** * Maps from an entity object to the storage record. * * @param \Drupal\Core\Entity\ContentEntityInterface $entity * The entity object. * @param string $table_name * (optional) The table name to map records to. Defaults to the base table. * * @return \stdClass * The record to store. */ protected function mapToStorageRecord(ContentEntityInterface $entity, $table_name = NULL) { if (!isset($table_name)) { $table_name = $this->baseTable; } $record = new \stdClass(); $table_mapping = $this->getTableMapping(); foreach ($table_mapping->getFieldNames($table_name) as $field_name) { if (empty($this->getFieldStorageDefinitions()[$field_name])) { throw new EntityStorageException(String::format('Table mapping contains invalid field %field.', array('%field' => $field_name))); } $definition = $this->getFieldStorageDefinitions()[$field_name]; $columns = $table_mapping->getColumnNames($field_name); foreach ($columns as $column_name => $schema_name) { // If there is no main property and only a single column, get all // properties from the first field item and assume that they will be // stored serialized. // @todo Give field types more control over this behavior in // https://drupal.org/node/2232427. if (!$definition->getMainPropertyName() && count($columns) == 1) { $value = $entity->{$field_name}->first()->getValue(); } else { $value = isset($entity->{$field_name}->{$column_name}) ? $entity->{$field_name}->{$column_name} : NULL; } if (!empty($definition->getSchema()['columns'][$column_name]['serialize'])) { $value = serialize($value); } $record->{$schema_name} = drupal_schema_get_field_value($definition->getSchema()['columns'][$column_name], $value); } } return $record; }