public SqlContentEntityStorage::getTableMapping(array $storage_definitions = NULL)
Gets a table mapping for the entity's SQL tables.
Parameters
\Drupal\Core\Field\FieldStorageDefinitionInterface[] $storage_definitions: (optional) An array of field storage definitions to be used to compute the table mapping. Defaults to the ones provided by the entity manager.
Return value
\Drupal\Core\Entity\Sql\TableMappingInterface A table mapping object for the entity's tables.
Overrides SqlEntityStorageInterface::getTableMapping
File
- core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php, line 272
Class
- SqlContentEntityStorage
- A content entity database storage implementation.
Namespace
Drupal\Core\Entity\Sql
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | public function getTableMapping( array $storage_definitions = NULL) { $table_mapping = $this ->tableMapping; // If we are using our internal storage definitions, which is our main use // case, we can statically cache the computed table mapping. If a new set // of field storage definitions is passed, for instance when comparing old // and new storage schema, we compute the table mapping without caching. // @todo Clean-up this in https://www.drupal.org/node/2274017 so we can // easily instantiate a new table mapping whenever needed. if (!isset( $this ->tableMapping) || $storage_definitions ) { $definitions = $storage_definitions ? : $this ->entityManager->getFieldStorageDefinitions( $this ->entityTypeId); $table_mapping = new DefaultTableMapping( $this ->entityType, $definitions ); $shared_table_definitions = array_filter ( $definitions , function (FieldStorageDefinitionInterface $definition ) use ( $table_mapping ) { return $table_mapping ->allowsSharedTableStorage( $definition ); }); $key_fields = array_values ( array_filter ( array ( $this ->idKey, $this ->revisionKey, $this ->bundleKey, $this ->uuidKey, $this ->langcodeKey))); $all_fields = array_keys ( $shared_table_definitions ); $revisionable_fields = array_keys ( array_filter ( $shared_table_definitions , function (FieldStorageDefinitionInterface $definition ) { return $definition ->isRevisionable(); })); // Make sure the key fields come first in the list of fields. $all_fields = array_merge ( $key_fields , array_diff ( $all_fields , $key_fields )); // Nodes have all three of these fields, while custom blocks only have // log. // @todo Provide automatic definitions for revision metadata fields in $revision_metadata_fields = array_intersect ( array ( 'revision_timestamp' , 'revision_uid' , 'revision_log' , ), $all_fields ); $revisionable = $this ->entityType->isRevisionable(); $translatable = $this ->entityType->isTranslatable(); if (! $revisionable && ! $translatable ) { // The base layout stores all the base field values in the base table. $table_mapping ->setFieldNames( $this ->baseTable, $all_fields ); } elseif ( $revisionable && ! $translatable ) { // The revisionable layout stores all the base field values in the base // table, except for revision metadata fields. Revisionable fields // denormalized in the base table but also stored in the revision table // together with the entity ID and the revision ID as identifiers. $table_mapping ->setFieldNames( $this ->baseTable, array_diff ( $all_fields , $revision_metadata_fields )); $revision_key_fields = array ( $this ->idKey, $this ->revisionKey); $table_mapping ->setFieldNames( $this ->revisionTable, array_merge ( $revision_key_fields , $revisionable_fields )); } elseif (! $revisionable && $translatable ) { // Multilingual layouts store key field values in the base table. The // other base field values are stored in the data table, no matter // whether they are translatable or not. The data table holds also a // denormalized copy of the bundle field value to allow for more // performant queries. This means that only the UUID is not stored on // the data table. $table_mapping ->setFieldNames( $this ->baseTable, $key_fields ) ->setFieldNames( $this ->dataTable, array_values ( array_diff ( $all_fields , array ( $this ->uuidKey)))); } elseif ( $revisionable && $translatable ) { // The revisionable multilingual layout stores key field values in the // base table, except for language, which is stored in the revision // table along with revision metadata. The revision data table holds // data field values for all the revisionable fields and the data table // holds the data field values for all non-revisionable fields. The data // field values of revisionable fields are denormalized in the data // table, as well. $table_mapping ->setFieldNames( $this ->baseTable, array_values ( $key_fields )); // Like in the multilingual, non-revisionable case the UUID is not // in the data table. Additionally, do not store revision metadata // fields in the data table. $data_fields = array_values ( array_diff ( $all_fields , array ( $this ->uuidKey), $revision_metadata_fields )); $table_mapping ->setFieldNames( $this ->dataTable, $data_fields ); $revision_base_fields = array_merge ( array ( $this ->idKey, $this ->revisionKey, $this ->langcodeKey), $revision_metadata_fields ); $table_mapping ->setFieldNames( $this ->revisionTable, $revision_base_fields ); $revision_data_key_fields = array ( $this ->idKey, $this ->revisionKey, $this ->langcodeKey); $revision_data_fields = array_diff ( $revisionable_fields , $revision_metadata_fields , array ( $this ->langcodeKey)); $table_mapping ->setFieldNames( $this ->revisionDataTable, array_merge ( $revision_data_key_fields , $revision_data_fields )); } // Add dedicated tables. $dedicated_table_definitions = array_filter ( $definitions , function (FieldStorageDefinitionInterface $definition ) use ( $table_mapping ) { return $table_mapping ->requiresDedicatedTableStorage( $definition ); }); $extra_columns = array ( 'bundle' , 'deleted' , 'entity_id' , 'revision_id' , 'langcode' , 'delta' , ); foreach ( $dedicated_table_definitions as $field_name => $definition ) { $tables = [ $table_mapping ->getDedicatedDataTableName( $definition )]; if ( $revisionable && $definition ->isRevisionable()) { $tables [] = $table_mapping ->getDedicatedRevisionTableName( $definition ); } foreach ( $tables as $table_name ) { $table_mapping ->setFieldNames( $table_name , array ( $field_name )); $table_mapping ->setExtraColumns( $table_name , $extra_columns ); } } // Cache the computed table mapping only if we are using our internal // storage definitions. if (! $storage_definitions ) { $this ->tableMapping = $table_mapping ; } } return $table_mapping ; } |
Please login to continue.