namespace Drupal\field\Entity;
use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\Entity\FieldableEntityStorageInterface;
use Drupal\Core\Field\FieldConfigBase;
use Drupal\Core\Field\FieldException;
use Drupal\field\FieldStorageConfigInterface;
*/
public static function preDelete(EntityStorageInterface $storage, array $fields) {
$state = \Drupal::state();
+ $entity_type_manager = \Drupal::entityTypeManager();
parent::preDelete($storage, $fields);
// Keep the field definitions in the state storage so we can use them
// later during field_purge_batch().
$deleted_fields = $state->get('field.field.deleted') ?: [];
+
+ /** @var \Drupal\field\FieldConfigInterface $field */
foreach ($fields as $field) {
- if (!$field->deleted) {
+ // Only mark a field for purging if there is data. Otherwise, just remove
+ // it.
+ $target_entity_storage = $entity_type_manager->getStorage($field->getTargetEntityTypeId());
+ if (!$field->deleted && $target_entity_storage instanceof FieldableEntityStorageInterface && $target_entity_storage->countFieldData($field->getFieldStorageDefinition(), TRUE)) {
$config = $field->toArray();
$config['deleted'] = TRUE;
$config['field_storage_uuid'] = $field->getFieldStorageDefinition()->uuid();