You are here

protected function SqlContentEntityStorageSchema::getEntitySchema in Drupal 8

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema::getEntitySchema()
  2. 10 core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema::getEntitySchema()

Gets the entity schema for the specified entity type.

Entity types may override this method in order to optimize the generated schema of the entity tables. However, only cross-field optimizations should be added here; e.g., an index spanning multiple fields. Optimizations that apply to a single field have to be added via SqlContentEntityStorageSchema::getSharedTableFieldSchema() instead.

Parameters

\Drupal\Core\Entity\ContentEntityTypeInterface $entity_type: The entity type definition.

bool $reset: (optional) If set to TRUE static cache will be ignored and a new schema array generation will be performed. Defaults to FALSE.

Return value

array A Schema API array describing the entity schema, excluding dedicated field tables.

12 calls to SqlContentEntityStorageSchema::getEntitySchema()
CommentStorageSchema::getEntitySchema in core/modules/comment/src/CommentStorageSchema.php
Gets the entity schema for the specified entity type.
ContentModerationStateStorageSchema::getEntitySchema in core/modules/content_moderation/src/ContentModerationStateStorageSchema.php
Gets the entity schema for the specified entity type.
EntityTestUpdateStorageSchema::getEntitySchema in core/modules/system/tests/modules/entity_test_update/src/EntityTestUpdateStorageSchema.php
Gets the entity schema for the specified entity type.
NodeStorageSchema::getEntitySchema in core/modules/node/src/NodeStorageSchema.php
Gets the entity schema for the specified entity type.
PathAliasStorageSchema::getEntitySchema in core/modules/path_alias/src/PathAliasStorageSchema.php
Gets the entity schema for the specified entity type.

... See full list

7 methods override SqlContentEntityStorageSchema::getEntitySchema()
CommentStorageSchema::getEntitySchema in core/modules/comment/src/CommentStorageSchema.php
Gets the entity schema for the specified entity type.
ContentModerationStateStorageSchema::getEntitySchema in core/modules/content_moderation/src/ContentModerationStateStorageSchema.php
Gets the entity schema for the specified entity type.
EntityTestUpdateStorageSchema::getEntitySchema in core/modules/system/tests/modules/entity_test_update/src/EntityTestUpdateStorageSchema.php
Gets the entity schema for the specified entity type.
NodeStorageSchema::getEntitySchema in core/modules/node/src/NodeStorageSchema.php
Gets the entity schema for the specified entity type.
PathAliasStorageSchema::getEntitySchema in core/modules/path_alias/src/PathAliasStorageSchema.php
Gets the entity schema for the specified entity type.

... See full list

File

core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php, line 949

Class

SqlContentEntityStorageSchema
Defines a schema handler that supports revisionable, translatable entities.

Namespace

Drupal\Core\Entity\Sql

Code

protected function getEntitySchema(ContentEntityTypeInterface $entity_type, $reset = FALSE) {
  $this
    ->checkEntityType($entity_type);
  $entity_type_id = $entity_type
    ->id();
  if (!isset($this->schema[$entity_type_id]) || $reset) {

    // Prepare basic information about the entity type.

    /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
    $table_mapping = $this
      ->getTableMapping($entity_type, $this->fieldStorageDefinitions);
    $tables = $this
      ->getEntitySchemaTables($table_mapping);

    // Initialize the table schema.
    $schema[$tables['base_table']] = $this
      ->initializeBaseTable($entity_type);
    if (isset($tables['revision_table'])) {
      $schema[$tables['revision_table']] = $this
        ->initializeRevisionTable($entity_type);
    }
    if (isset($tables['data_table'])) {
      $schema[$tables['data_table']] = $this
        ->initializeDataTable($entity_type);
    }
    if (isset($tables['revision_data_table'])) {
      $schema[$tables['revision_data_table']] = $this
        ->initializeRevisionDataTable($entity_type);
    }

    // We need to act only on shared entity schema tables.
    $table_names = array_diff($table_mapping
      ->getTableNames(), $table_mapping
      ->getDedicatedTableNames());
    foreach ($table_names as $table_name) {
      if (!isset($schema[$table_name])) {
        $schema[$table_name] = [];
      }
      foreach ($table_mapping
        ->getFieldNames($table_name) as $field_name) {
        if (!isset($this->fieldStorageDefinitions[$field_name])) {
          throw new FieldException("Field storage definition for '{$field_name}' could not be found.");
        }
        elseif ($table_mapping
          ->allowsSharedTableStorage($this->fieldStorageDefinitions[$field_name])) {
          $column_names = $table_mapping
            ->getColumnNames($field_name);
          $storage_definition = $this->fieldStorageDefinitions[$field_name];
          $schema[$table_name] = array_merge_recursive($schema[$table_name], $this
            ->getSharedTableFieldSchema($storage_definition, $table_name, $column_names));
        }
      }
    }

    // Process tables after having gathered field information.
    $this
      ->processBaseTable($entity_type, $schema[$tables['base_table']]);
    if (isset($tables['revision_table'])) {
      $this
        ->processRevisionTable($entity_type, $schema[$tables['revision_table']]);
    }
    if (isset($tables['data_table'])) {
      $this
        ->processDataTable($entity_type, $schema[$tables['data_table']]);
    }
    if (isset($tables['revision_data_table'])) {
      $this
        ->processRevisionDataTable($entity_type, $schema[$tables['revision_data_table']]);
    }

    // Add an index for the 'published' entity key.
    if (is_subclass_of($entity_type
      ->getClass(), EntityPublishedInterface::class)) {
      $published_key = $entity_type
        ->getKey('published');
      if ($published_key && isset($this->fieldStorageDefinitions[$published_key]) && !$this->fieldStorageDefinitions[$published_key]
        ->hasCustomStorage()) {
        $published_field_table = $table_mapping
          ->getFieldTableName($published_key);
        $id_key = $entity_type
          ->getKey('id');
        if ($bundle_key = $entity_type
          ->getKey('bundle')) {
          $key = "{$published_key}_{$bundle_key}";
          $columns = [
            $published_key,
            $bundle_key,
            $id_key,
          ];
        }
        else {
          $key = $published_key;
          $columns = [
            $published_key,
            $id_key,
          ];
        }
        $schema[$published_field_table]['indexes'][$this
          ->getEntityIndexName($entity_type, $key)] = $columns;
      }
    }
    $this->schema[$entity_type_id] = $schema;
  }
  return $this->schema[$entity_type_id];
}