protected SqlContentEntityStorage::readFieldItemsToPurge(FieldDefinitionInterface $field_definition, $batch_size)
Reads values to be purged for a single field.
This method is called during field data purge, on fields for which onFieldDefinitionDelete() has previously run.
Parameters
\Drupal\Core\Field\FieldDefinitionInterface $field_definition: The field definition.
$batch_size: The maximum number of field data records to purge before returning.
Return value
\Drupal\Core\Field\FieldItemListInterface[] An array of field item lists, keyed by entity revision id.
Overrides ContentEntityStorageBase::readFieldItemsToPurge
File
- core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php, line 1514
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 | protected function readFieldItemsToPurge(FieldDefinitionInterface $field_definition , $batch_size ) { // Check whether the whole field storage definition is gone, or just some // bundle fields. $storage_definition = $field_definition ->getFieldStorageDefinition(); $is_deleted = $this ->storageDefinitionIsDeleted( $storage_definition ); $table_mapping = $this ->getTableMapping(); $table_name = $table_mapping ->getDedicatedDataTableName( $storage_definition , $is_deleted ); // Get the entities which we want to purge first. $entity_query = $this ->database->select( $table_name , 't' , array ( 'fetch' => \PDO::FETCH_ASSOC)); $or = $entity_query ->orConditionGroup(); foreach ( $storage_definition ->getColumns() as $column_name => $data ) { $or ->isNotNull( $table_mapping ->getFieldColumnName( $storage_definition , $column_name )); } $entity_query ->distinct(TRUE) ->fields( 't' , array ( 'entity_id' )) ->condition( 'bundle' , $field_definition ->getTargetBundle()) ->range(0, $batch_size ); // Create a map of field data table column names to field column names. $column_map = array (); foreach ( $storage_definition ->getColumns() as $column_name => $data ) { $column_map [ $table_mapping ->getFieldColumnName( $storage_definition , $column_name )] = $column_name ; } $entities = array (); $items_by_entity = array (); foreach ( $entity_query ->execute() as $row ) { $item_query = $this ->database->select( $table_name , 't' , array ( 'fetch' => \PDO::FETCH_ASSOC)) ->fields( 't' ) ->condition( 'entity_id' , $row [ 'entity_id' ]) ->condition( 'deleted' , 1) ->orderBy( 'delta' ); foreach ( $item_query ->execute() as $item_row ) { if (!isset( $entities [ $item_row [ 'revision_id' ]])) { // Create entity with the right revision id and entity id combination. $item_row [ 'entity_type' ] = $this ->entityTypeId; // @todo: Replace this by an entity object created via an entity // factory, see https://www.drupal.org/node/1867228. $entities [ $item_row [ 'revision_id' ]] = _field_create_entity_from_ids((object) $item_row ); } $item = array (); foreach ( $column_map as $db_column => $field_column ) { $item [ $field_column ] = $item_row [ $db_column ]; } $items_by_entity [ $item_row [ 'revision_id' ]][] = $item ; } } // Create field item objects and return. foreach ( $items_by_entity as $revision_id => $values ) { $entity_adapter = $entities [ $revision_id ]->getTypedData(); $items_by_entity [ $revision_id ] = \Drupal::typedDataManager()->create( $field_definition , $values , $field_definition ->getName(), $entity_adapter ); } return $items_by_entity ; } |
Please login to continue.