Issue #1854912 by seanB, bojanz, dermario, fubhy, jhedstrom: Don't assume that the array keys are entity id's in EntityStorageBase::delete()

8.0.x
Alex Pott 2015-09-08 16:32:35 +01:00
parent ed9b912dc6
commit 40ad8eefae
3 changed files with 38 additions and 10 deletions

View File

@ -351,20 +351,26 @@ abstract class EntityStorageBase extends EntityHandlerBase implements EntityStor
return; return;
} }
// Ensure that the entities are keyed by ID.
$keyed_entities = [];
foreach ($entities as $entity) {
$keyed_entities[$entity->id()] = $entity;
}
// Allow code to run before deleting. // Allow code to run before deleting.
$entity_class = $this->entityClass; $entity_class = $this->entityClass;
$entity_class::preDelete($this, $entities); $entity_class::preDelete($this, $keyed_entities);
foreach ($entities as $entity) { foreach ($keyed_entities as $entity) {
$this->invokeHook('predelete', $entity); $this->invokeHook('predelete', $entity);
} }
// Perform the delete and reset the static cache for the deleted entities. // Perform the delete and reset the static cache for the deleted entities.
$this->doDelete($entities); $this->doDelete($keyed_entities);
$this->resetCache(array_keys($entities)); $this->resetCache(array_keys($keyed_entities));
// Allow code to run after deleting. // Allow code to run after deleting.
$entity_class::postDelete($this, $entities); $entity_class::postDelete($this, $keyed_entities);
foreach ($entities as $entity) { foreach ($keyed_entities as $entity) {
$this->invokeHook('delete', $entity); $this->invokeHook('delete', $entity);
} }
} }

View File

@ -146,10 +146,7 @@ class KeyValueEntityStorage extends EntityStorageBase {
* {@inheritdoc} * {@inheritdoc}
*/ */
public function doDelete($entities) { public function doDelete($entities) {
$entity_ids = array(); $entity_ids = array_keys($entities);
foreach ($entities as $entity) {
$entity_ids[] = $entity->id();
}
$this->keyValueStore->deleteMultiple($entity_ids); $this->keyValueStore->deleteMultiple($entity_ids);
} }

View File

@ -95,6 +95,31 @@ class EntityApiTest extends EntityUnitTestBase {
if ($revision_table = $definition->getRevisionTable()) { if ($revision_table = $definition->getRevisionTable()) {
$this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_table . '}')->fetchField(), 'Data table was emptied'); $this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_table . '}')->fetchField(), 'Data table was emptied');
} }
// Test deleting a list of entities not indexed by entity id.
$entities = array();
$entity = entity_create($entity_type, array('name' => 'test', 'user_id' => $user1->id()));
$entity->save();
$entities['test'] = $entity;
$entity = entity_create($entity_type, array('name' => 'test2', 'user_id' => $user1->id()));
$entity->save();
$entities['test2'] = $entity;
$controller = \Drupal::entityManager()->getStorage($entity_type);
$controller->delete($entities);
// Verify that entities got deleted.
$all = entity_load_multiple($entity_type);
$this->assertTrue(empty($all), format_string('%entity_type: Deleted all entities.', array('%entity_type' => $entity_type)));
// Verify that all data got deleted from the tables.
$definition = \Drupal::entityManager()->getDefinition($entity_type);
$this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $definition->getBaseTable() . '}')->fetchField(), 'Base table was emptied');
if ($data_table = $definition->getDataTable()) {
$this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $data_table . '}')->fetchField(), 'Data table was emptied');
}
if ($revision_table = $definition->getRevisionTable()) {
$this->assertEqual(0, db_query('SELECT COUNT(*) FROM {' . $revision_table . '}')->fetchField(), 'Data table was emptied');
}
} }
/** /**