Отображать среднее значение по столбцу?


ОТРЕДАКТИРОВАНО: Это было изменено, чтобы включить код, предложенный Дооштой.

Мне нужно заполнить вычисляемое поле средним значением всех записей в определенном поле и только из узлов, у которых есть определенное поле ссылки на узел.

Что у меня есть прямо сейчас в моем вычисляемом поле:

$nids = db_query('
  SELECT entity_id FROM {field_revision_field_venue_reference_review}
  WHERE field_venue_reference_review_target_id = :nid',
  array(':nid' => $entity->nid)
)->fetchCol();

$entity_field[0]['value'] = db_query('
   SELECT AVG(field_payment_review_value) FROM {field_data_field_payment_review}
   WHERE entity_id IN (:nids)', 
   array(':nids' => $nids)
)->fetchField();

Это работает и отображает правильное среднее значение из правильных узлов. Тем не менее, я получаю ошибку исключения PODexception на некоторых страницах, которые не включают вышеуказанное код. Это сбивает меня с толку, потому что кажется, что если есть плохой синтаксис, то я должен получить ошибку на странице, использующей код, а также на страницах, не использующих код, верно? Либо так, либо это просто не должно сработать.

PODexception Error

По просьбе Бошты, вот скриншоты таблиц, которые я запрашиваю. Первая - это таблица, содержащая поле ссылки на сущность в части $nids запроса Screenshot of Table field_data_field_venue_reference_review

Вторая - это таблица, содержащая значения, усредняемые в $entity_field часть запроса Screenshot of Table field_data_field_payment_review

 1
Author: Mrweiner, 2012-05-09

1 answers

Я не знаком с модулем вычисляемого поля и не уверен, что полностью понимаю взаимосвязи между вашими узлами и полями, но вот о том, как вы должны быть в состоянии заставить все работать.

Первый запрос, похоже, был бы в порядке, если бы вы удалили эту дополнительную закрывающую скобку и использовали fetchField() для извлечения значения:

$entity_field[0]['value'] = db_query('
   SELECT AVG(field_payment_review_value) FROM {field_data_field_payment_review}
')->fetchField();

Со вторым нужно еще немного поработать. Я предполагаю, что у вас есть узлы обзора с рейтингами, и каждый узел обзора связан с бизнес-узел с каким-либо ссылочным полем.

Сначала я бы получил nid-ы тех узлов обзора, которые связаны с текущим бизнес-узлом в виде массива (используя fetchCol()) примерно так:

$nids = db_query('
  SELECT entity_id FROM {field_data_field_business_reference}
  WHERE field_business_reference = :nid AND entity_type = :type AND bundle = :bundle',
  array(':nid' => $entity->nid, ':type' => 'node', ':bundle' => 'review')
)->fetchCol();

Затем получите среднее значение:

$entity_field[0]['value'] = db_query('
   SELECT AVG(field_payment_review_value) FROM {field_data_field_payment_review}
   WHERE entity_id IN (:nids) AND entity_type = :type AND bundle = :bundle',
   array(':nids' => $nids, ':type' => 'node', ':bundle' => 'review')
)->fetchField();

ОБНОВЛЕНИЕ:

Чтобы избежать ошибки, которую вы получаете, вы можете попробовать обернуть код в некоторые операторы if, чтобы убедиться, что он не будет выполнен, если не будут выполнены необходимые критерии:

$node = menu_get_object();
if (isset($node->type) && $node->type == 'venue') {
  // put the query that retrieves the nids here.
  if (is_array($nids) && !empty($nids)) {
    // put the query that calculates the average here.
  }
}

Если это слишком ограничительно вам может сойти с рук только это:

  // put the query that retrieves the nids here.
  if (is_array($nids) && !empty($nids)) {
    // put the query that calculates the average here.
  }
 1
Author: Madis, 2012-05-13 20:32:59