You are here

function relation_entity_delete in Relation 8

Same name and namespace in other branches
  1. 8.2 relation.module \relation_entity_delete()
  2. 7 relation.module \relation_entity_delete()

Implements hook_entity_delete().

File

./relation.module, line 263
Describes relations between entities.

Code

function relation_entity_delete(EntityInterface $entity) {
  if ($entity
    ->getEntityTypeId() == 'relation' && $entity->endpoints) {
    relation_clear_related_entities_cache($entity->endpoints);
  }

  // Check if there is any relation.
  $relations_exist = \Drupal::entityTypeManager()
    ->getStorage('relation')
    ->getQuery()
    ->count()
    ->execute();
  if ($relations_exist) {

    // Delete relations to this entity.
    $relation_ids = relation_query($entity
      ->getEntityTypeId(), $entity
      ->id())
      ->execute();

    // IDs of relations to delete.
    $relations_to_delete = array();
    foreach (Relation::loadMultiple($relation_ids) as $relation) {

      // Remove any endpoints pointing to entity.
      foreach ($relation->endpoints as $key => $endpoint) {
        if ($endpoint->entity_id == $entity
          ->id() && $endpoint->entity_type == $entity
          ->getEntityTypeId()) {
          unset($relation->endpoints[$key]);
        }
      }

      // Check if relation remains valid with regards to arity.
      $relation_type = RelationType::load($relation
        ->bundle());
      $arity = count($relation->endpoints);
      if ($relation_type && $arity < $relation_type->min_arity) {

        // Not valid - delete.
        array_push($relations_to_delete, $relation
          ->id());
      }
      else {

        // Valid - save.
        $relation
          ->save();
      }
    }
    if (!empty($relations_to_delete)) {
      $storage_handler = \Drupal::entityTypeManager()
        ->getStorage('relation');
      $relations = $storage_handler
        ->loadMultiple($relations_to_delete);
      $storage_handler
        ->delete($relations);
      \Drupal::logger('relation')
        ->error('Relations @relations have been deleted.', array(
        '@relations' => implode(', ', $relations_to_delete),
      ));
    }
  }
}