我这里有一些评论,用户可以在这里对内容进行评分。
我想得到每个内容的平均评分,我如何有效地获得平均分?
我有以下代码来获得平均值:
$cids = \Drupal::entityQuery('comment')
->condition('entity_id', $variables['row']->nid)
->condition('entity_type', 'node')
->condition('comment_type', 'content_rating')
->execute();
$comments = [];
$totalRating = 0;
if ($cids) {
foreach ($cids as $cid) {
$comment = Comment::load($cid);
$comments[] = $comment->get('field_rating')->value;
}
$totRating = array_sum($comments) / count( $comments );
$totalRating = ceil($totRating);
}
我知道这是没有效率的,因为我得到了所有的评论和手工计算的平均评分。
如何获得查询级别上的平均评等?
发布于 2022-05-24 08:46:45
您应该在数据库中有一个名为comment__field_rating
的表。该表应该有一个类似于field_rating_value
的列。一旦您确认了这一点,就可以编写如下所示的查询:
$q = $database->db_select('comment__field_rating)
$q->addExpression('avg(field_rating_value)', 'avg_rating')
$avg = $q->execute()->fetchCol();
没有经过测试因为我没有你的数据库。
发布于 2022-05-20 07:32:46
在关于实体API的文档中,有一个来自EntityStorage的方法,您可以使用它来加载实体is的数组loadMultiple($id)
。然后,您可以循环遍历注释数组,并获得所有的field_ratings,就像您已经在做的那样。
// Load multiple entities, also exists as entity_load_multiple().
$entities = \Drupal::entityTypeManager()->getStorage($entity_type)
->loadMultiple([1, 2, 3]);
另外,不必加载\Drupal::entityTypeManager()
,您可以在类的构造函数中注入服务'entity_type.manager'
。这是最好的方式来称呼它,但第一个将工作正常。
https://drupal.stackexchange.com/questions/311204
复制相似问题