Рейтинг:1

Как я могу получить среднее значение поля комментария по node_id?

флаг us

У меня есть комментарии, в которых пользователь может оценить контент.

Я хочу получить средний рейтинг для каждого контента, как мне эффективно получить средний рейтинг?

У меня есть следующий код для получения среднего:

$cids = \Drupal::entityQuery('комментарий')
    ->условие('entity_id', $переменные['строка']->nid)
    ->условие('entity_type', 'узел')
    ->условие('comment_type', 'content_rating')
    ->выполнить();

$ комментарии = [];

$общий рейтинг = 0;

если ($cids) {
    foreach ($cids как $cid) {
        $comment = Комментарий::load($cid);
        $comments[] = $comment->get('field_rating')->значение;
    }

    $totRating = array_sum($comments) / count($comments);

    $totalRating = ceil($totRating);
}

Я знаю, что это неэффективно, потому что я получаю ВСЕ комментарии и вычисляю средний рейтинг вручную.

Как я могу получить средний рейтинг на уровне запроса?

Рейтинг:1
флаг ph

У вас должна быть таблица в вашей базе данных с именем что-то вроде comment__field_rating. В этой таблице должен быть такой столбец, как field_rating_value. Как только вы подтвердите это, вы можете написать запрос примерно так:

$q = $database->db_select('comment__field_rating)
$q->addExpression('средний(field_rating_value)', 'средний_рейтинг')
$avg = $q->execute()->fetchCol();

Это все непроверено, потому что у меня нет вашей базы данных.

Рейтинг:0
флаг cn

In the docs about the Entity API, there is a method from EntityStorage that you can use to load an array of entity IDs, the loadMultiple($id). Then you can loop through the array of Comments and get all field_ratings like you are already doing.

// Load multiple entities, also exists as entity_load_multiple().
$entities = \Drupal::entityTypeManager()->getStorage($entity_type)
  ->loadMultiple([1, 2, 3]);

Also, instead of loading \Drupal::entityTypeManager(), you can inject the service 'entity_type.manager' inside the constructor of your class. This is the best way to call it, but the first one will work ok.

флаг us
Моя цель здесь — получить средний рейтинг и свести к минимуму использование памяти.Ваш ответ не касается этого. Предположим, что есть миллион комментариев. Получение всех комментариев приведет к ошибке «Разрешенный размер памяти исчерпан». Я хочу получить средний рейтинг на уровне запроса. Например, такой запрос: «ВЫБЕРИТЕ AVG (цена) AS AveragePrice FROM Products»;
Jean da Silva avatar
флаг cn
Я понимаю. Тогда, если я правильно понял, вы не можете сделать динамический запрос, чтобы вернуть СУММУ всех field_ratings, и другой динамический запрос, чтобы вернуть количество всех комментариев, а затем в PHP использовать оба значения, чтобы получить среднее значение? Если невозможно суммировать и подсчитать каждый реестр таблицы, то можете ли вы сделать это в пакетном режиме? Подсчитайте количество реестров и разделите их на пакеты. В любом случае вы можете получить только сумму или field_rating, если хотите, вместо того, чтобы загружать каждый объект.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.