function SqlContentEntityStorage::readFieldItemsToPurge
Same name in other branches
- 9 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()
- 11.x core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php \Drupal\Core\Entity\Sql\SqlContentEntityStorage::readFieldItemsToPurge()
Overrides ContentEntityStorageBase::readFieldItemsToPurge
File
-
core/
lib/ Drupal/ Core/ Entity/ Sql/ SqlContentEntityStorage.php, line 1659
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;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.