protected function SqlContentEntityStorage::readFieldItemsToPurge in Drupal 9
Same name and namespace in other branches
- 8 core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php \Drupal\Core\Entity\Sql\SqlContentEntityStorage::readFieldItemsToPurge()
- 10 core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php \Drupal\Core\Entity\Sql\SqlContentEntityStorage::readFieldItemsToPurge()
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 1627
Class
- SqlContentEntityStorage
- A content entity database storage implementation.
Namespace
Drupal\Core\Entity\SqlCode
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();
$table_mapping = $this
->getTableMapping();
$table_name = $table_mapping
->getDedicatedDataTableName($storage_definition, $storage_definition
->isDeleted());
// Get the entities which we want to purge first.
$entity_query = $this->database
->select($table_name, 't', [
'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', [
'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 = [];
foreach ($storage_definition
->getColumns() as $column_name => $data) {
$column_map[$table_mapping
->getFieldColumnName($storage_definition, $column_name)] = $column_name;
}
$entities = [];
$items_by_entity = [];
foreach ($entity_query
->execute() as $row) {
$item_query = $this->database
->select($table_name, 't', [
'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 = [];
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;
}