Отображать среднее значение по столбцу?
ОТРЕДАКТИРОВАНО: Это было изменено, чтобы включить код, предложенный Дооштой.
Мне нужно заполнить вычисляемое поле средним значением всех записей в определенном поле и только из узлов, у которых есть определенное поле ссылки на узел.
Что у меня есть прямо сейчас в моем вычисляемом поле:
$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 на некоторых страницах, которые не включают вышеуказанное код. Это сбивает меня с толку, потому что кажется, что если есть плохой синтаксис, то я должен получить ошибку на странице, использующей код, а также на страницах, не использующих код, верно? Либо так, либо это просто не должно сработать.
По просьбе Бошты, вот скриншоты таблиц, которые я запрашиваю.
Первая - это таблица, содержащая поле ссылки на сущность в части $nids
запроса
Вторая - это таблица, содержащая значения, усредняемые в $entity_field
часть запроса
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.
}