Как посчитать количество ссылающихся сущностей?

Аватар пользователя VVS VVS 14 июня в 18:28

Для 7 был модуль.

Как в 9 посчитать у родительской сущности и вывести в поле количество "вложенных" сущностей.

Родитель:
- Ребёнок
- Ребёнок
- Ребёнок
- Количество детей

Комментарии

Аватар пользователя marassa marassa 14 июня в 19:08

Я делал кодом в hook_cron. У меня нет необходимости иметь всегда абсолютно точный счетчик, небольшое расхождение в течение суток вполне допустимо. Также не хотелось считать эти счетчики каждый раз "на лету", когда во вьюхе около ста записей, и для каждой надо посчитать количество ссылающихся, которых тоже могут быть сотни. Поэтому просто создал поле count и по крону два раза в сутки его заново пересчитываю.
Если нужно, чтобы счетчик обновлялся мгновенно, то нужно отслеживать хуками все создания, изменения и удаления записей.
Но это в любом случае не "простое и готовое" Smile

Аватар пользователя marassa marassa 14 июня в 20:33
2

Вот как-то так у меня:

/**
 * Implements hook_cron().
 */

function MYMODULE_cron() {

  $ids = Drupal::entityQuery('taxonomy_term')
    ->condition('vid', 'tags')
    ->condition('status', 1)
    ->condition('default_langcode', 1)
    ->execute();
  foreach ($ids as $id) {
    $count = Drupal::entityQuery('node')
      ->condition('type', 'pictures')
      ->condition('status', '1')
      ->condition('default_langcode', 1)
      ->condition('field_picture_tags', $id)
      ->count()
      ->execute();
    $entity = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($id);
    if ($entity->field_picture_count->value != ($count?$count:NULL)) {
      $entity->field_picture_count->value = $count ?: NULL;
      $entity->save();
    }
  }

  $ids = Drupal::entityQuery('node')
    ->condition('type', 'cities')
    ->condition('status', 1)
    ->condition('default_langcode', 1)
    ->execute();
  foreach ($ids as $id) {
    $count = Drupal::entityQuery('node')
      ->condition('type', 'artefacts')
      ->condition('status', '1')
      ->condition('default_langcode', 1)
      ->condition('field_city', $id)
      ->count()
      ->execute();
    $entity = \Drupal::entityTypeManager()->getStorage('node')->load($id);
    if ($entity->field_artefact_count->value != ($count ?: NULL)) {
      $entity->field_artefact_count->value = $count ?: NULL;
      $entity->save();
    }
  }
}