Puncte:1

Cum pot obține Media unui câmp de comentariu prin node_id?

drapel us

Am comentarii aici în care utilizatorul poate evalua un conținut.

Vreau să obțin evaluarea medie pe conținut, cum obțin eficient media?

Am următorul cod pentru a obține media:

$cids = \Drupal::entityQuery('comment')
    ->condition('entity_id', $variables['row']->nid)
    ->condition('entity_type', 'node')
    ->condition('tip_comment', 'evaluare_conţinut')
    ->execute();

$comentarii = [];

$totalRating = 0;

dacă ($cids) {
    foreach ($cids ca $cid) {
        $coment = Comentariu::load($cid);
        $comentarii[] = $comment->get('field_rating')->valoare;
    }

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

    $totalRating = plafon($totRating);
}

Știu că acest lucru nu este eficient pentru că primesc TOATE comentariile și calculez manual pentru evaluarea medie.

Cum pot obține evaluarea medie la nivel de interogare?

Puncte:1
drapel ph

Ar trebui să aveți un tabel în baza de date numit ceva de genul comment__field_rating. Tabelul ar trebui să aibă o coloană ca valoare_evaluare_câmp. Odată ce ați confirmat acest lucru, puteți scrie o interogare cam așa:

$q = $bază de date->db_select('comment__field_rating)
$q->addExpression('avg(field_rating_value)', 'avg_rating')
$avg = $q->execute()->fetchCol();

Toate acestea nu au fost testate pentru că nu am baza ta de date.

Puncte:0
drapel 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.

drapel us
Scopul meu aici este să obțin evaluarea medie și să reduc la minimum utilizarea memoriei.Răspunsul dvs. nu abordează acest lucru. Să presupunem că există un milion de comentarii. Obținerea tuturor comentariilor va duce la eroarea „Dimensiunea memoriei permisă epuizată”. Vreau să obțin evaluarea medie la un nivel de interogare. Cum ar fi interogarea astfel `SELECT AVG(Price) AS AveragePrice FROM Products;`
Jean da Silva avatar
drapel cn
Văd. Apoi, dacă am înțeles bine, nu puteți face o interogare dinamică pentru a returna o SUMA a tuturor evaluărilor field_ratings și o altă interogare dinamică pentru a returna numărul tuturor comentariilor, atunci în PHP folosiți ambele valori pentru a obține media? Dacă nu este posibil să însumați și să numărați fiecare registru al tabelului, atunci puteți face acest lucru în lot? Numărați numărul de registre și apoi separați în loturi. În orice caz, puteți prelua doar suma sau field_rating dacă doriți, în loc să încărcați fiecare entitate.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.