Score:0

วิธีใช้ฟังก์ชัน sql MAX() ในแบบสอบถามปลั๊กอินมุมมอง

ธง gb

ฉันกำลังสร้างตัวกรองมุมมองที่กำหนดเองสำหรับฟิลด์มุมมองที่กำหนดเอง SQL ต่อไปนี้จะทำให้ตัวกรองที่ฉันค้นหาสำเร็จ:

เลือก nid, moderation_state, content_entity_id, MAX(content_entity_revision_id) 
  จากโหนดภายในเข้าร่วม content_moderation_state_field_revision บน nid = content_entity_id 
    โดยที่ content_entity_id = 59 จัดกลุ่มตาม content_entity_id

ในไฟล์ php ปลั๊กอินตัวกรองมุมมองของฉัน ฉันมีรหัสต่อไปนี้เพื่อเพิ่ม sql ด้านบนในแบบสอบถามตัวกรอง:

/**
   * ฟังก์ชันตัวช่วยที่สร้างแบบสอบถาม
   */
  แบบสอบถามฟังก์ชันสาธารณะ () {
    ถ้า (!empty($this->value)) {
      $การกำหนดค่า = [
        'table' => 'content_moderation_state_field_revision',
        'field' => 'content_entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'นิด',
        'ตัวดำเนินการ' => '=',
      ];
      $join = Views::pluginManager('join')->createInstance('มาตรฐาน', $configuration);
      $this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');
      $this->query->addExpression('MAX(content_moderation_state_field_revision.content_entity_revision_id)');
      $this->query->groupBy("content_moderation_state_field_revision.content_entity_id");
      $this->query->addWhere('AND', 'content_moderation_state_field_revision', $this->value, 'IN');
    }
  }

ข้อผิดพลาดนี้เกิดขึ้นเมื่อดำเนินการค้นหา:

ข้อผิดพลาด: โทรไปยังวิธีการที่ไม่ได้กำหนด Drupal\views\Plugin\views\query\Sql::addExpression()

ในขณะที่ เพิ่มนิพจน์ () เป็นส่วนหนึ่งของ API ฐานข้อมูลหลัก ไม่รองรับปลั๊กอินการสืบค้นมุมมอง sql API,

ดังนั้น ฉันต้องการวิธีแก้ปัญหาเพื่อเพิ่มนิพจน์ MAX() ให้กับแบบสอบถาม ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีการทำเช่นนี้?

Score:0
ธง gb

ฉันพบวิธีแก้ปัญหาแล้ว!

รหัส SQL นี้ทำให้ฉันได้รับสิ่งที่ฉันกำลังมองหา:

เลือก * จาก content_moderation_state_field_revision โดยที่ (content_entity_id, content_entity_revision_id) ใน 
  ( 
    เลือก content_entity_id, MAX(content_entity_revision_id) จากกลุ่ม content_moderation_state_field_revision ตาม content_entity_id 
  ) 
  และ moderation_state = 'ฉบับร่าง'

โปรดทราบว่า MAX และการจัดกลุ่มตามฟังก์ชันทั้งหมดอยู่ในเคียวรีย่อยของ SQL ซึ่งไม่ต้องการการป้อน $row ดังนั้น ฉันจึงสร้างฟังก์ชันในโมดูลของฉันเพื่อแสดงผลลัพธ์ของเคียวรีย่อยนั้น และเพิ่มเป็นเงื่อนไขในเคียวรีตัวกรองปลั๊กอิน แบบนี้:

/**
   * ฟังก์ชันตัวช่วยที่สร้างแบบสอบถาม
   */
  แบบสอบถามฟังก์ชันสาธารณะ () {
    ถ้า (!empty($this->value)) {
      // ดูปลั๊กอินตัวจัดการเข้าร่วม: https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21join%21JoinPluginBase.php/group/views_join_handlers/8.2.x
      $การกำหนดค่า = [
        'type' => 'ภายใน',
        'table' => 'content_moderation_state_field_revision',
        'field' => 'content_entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'นิด',
        'ตัวดำเนินการ' => '=',
      ];
      $join = Views::pluginManager('join')->createInstance('มาตรฐาน', $configuration);
      $this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');     
      $this->query->addGroupBy("content_moderation_state_field_revision.content_entity_id");
      $revision_ids = sbn_moderation_state_sql_subquery(); // คืนค่า maximum_entity_revision_id
      $this->query->addWhere('AND', 'content_entity_revision_id', $revision_ids, 'IN');
      $this->query->addWhere('AND', 'moderation_state', $this->value, 'IN');
    }
  }

ฉันยังมีส่วนคำสั่ง addGroupBy แต่ฉันไม่คิดว่าจำเป็นเพราะฟังก์ชัน MAX อยู่ในแบบสอบถามย่อยซึ่งดูแลการส่งคืน content_entity_revision_id สูงสุดสำหรับแต่ละโหนด

แน่นอน ฉันยังไม่ทราบไวยากรณ์ที่ถูกต้องสำหรับการเพิ่มฟังก์ชัน MAX() ในไวยากรณ์ของปลั๊กอินเคียวรี sql api ของมุมมอง ถ้าใครรู้โปรดเพิ่มคำตอบนั้นด้วย

อย่างไรก็ตาม ตัวกรองทำงานได้อย่างมีเสน่ห์ -- ฉันสามารถกรองมุมมองตามโหนดที่เผยแพร่หรือแบบร่าง หรือทั้งสองอย่าง

โพสต์คำตอบ

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