Score:1

ฉันจะรับค่าเฉลี่ยของฟิลด์ความคิดเห็นโดย node_id ได้อย่างไร

ธง us

ฉันมีความคิดเห็นที่นี่ซึ่งผู้ใช้สามารถให้คะแนนเนื้อหาได้

ฉันต้องการคะแนนเฉลี่ยต่อเนื้อหา ฉันจะหาค่าเฉลี่ยอย่างมีประสิทธิภาพได้อย่างไร

ฉันมีรหัสต่อไปนี้เพื่อรับค่าเฉลี่ย:

$cids = \Drupal::entityQuery('ความคิดเห็น')
    ->condition('entity_id', $variables['row']->nid)
    ->เงื่อนไข ('entity_type', 'โหนด')
    ->เงื่อนไข ('comment_type', 'content_rating')
    ->ดำเนินการ ();

$ความคิดเห็น = [];

$totalRating = 0;

ถ้า ($ cids) {
    foreach ($cids เป็น $cid) {
        $comment = Comment::load($cid);
        $comments[] = $comment->get('field_rating')->value;
    }

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

    $totalRating = เพดาน($totRating);
}

ฉันรู้ว่าวิธีนี้ไม่ได้ผลเพราะฉันได้รับความคิดเห็นทั้งหมดและคำนวณคะแนนเฉลี่ยด้วยตนเอง

ฉันจะรับคะแนนเฉลี่ยในระดับการค้นหาได้อย่างไร

Score:1
ธง ph

คุณควรมีตารางในฐานข้อมูลของคุณที่ชื่อว่า ความคิดเห็น__field_rating. ตารางนั้นควรมีคอลัมน์เช่น field_rating_value. เมื่อคุณยืนยันแล้ว คุณสามารถเขียนข้อความค้นหาในลักษณะนี้:

$q = $database->db_select('comment__field_rating)
$q->addExpression('avg(field_rating_value)', 'avg_rating')
$avg = $q->execute()->fetchCol();

ทั้งหมดนี้ยังไม่ได้ทดสอบเพราะฉันไม่มีฐานข้อมูลของคุณ

Score: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 flag
เป้าหมายของฉันที่นี่คือการได้รับคะแนนเฉลี่ยและลดการใช้หน่วยความจำให้น้อยที่สุดคำตอบของคุณไม่ได้กล่าวถึงเรื่องนี้ สมมติว่ามีความคิดเห็นหนึ่งล้านความคิดเห็น การได้รับความคิดเห็นทั้งหมดจะทำให้เกิดข้อผิดพลาด `Allowed Memory Size Exhausted` ฉันต้องการรับคะแนนเฉลี่ยในระดับการค้นหา เช่นเดียวกับการค้นหาเช่นนี้ `เลือก AVG (ราคา) เป็นราคาเฉลี่ยจากผลิตภัณฑ์'
Jean da Silva avatar
cn flag
เข้าใจแล้ว. ถ้าฉันเข้าใจถูกต้อง คุณจะสร้างแบบสอบถามแบบไดนามิกเพื่อส่งคืนผลรวมของ field_ratings ทั้งหมด และแบบสอบถามแบบไดนามิกอื่นเพื่อส่งคืนจำนวนความคิดเห็นทั้งหมดไม่ได้ จากนั้นใน PHP จะใช้ทั้งสองค่าเพื่อรับค่าเฉลี่ย หากไม่สามารถรวมและนับทุกรีจิสตรีของตารางได้ คุณจะทำเป็นกลุ่มได้ไหม นับจำนวนการลงทะเบียนและแยกเป็นชุด ไม่ว่าจะด้วยวิธีใดก็ตาม คุณสามารถดึงเฉพาะผลรวมหรือ field_rating ได้หากต้องการ แทนที่จะต้องโหลดทุกเอนทิตี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา